多表查询首先要建立外键:
models.py(重要):
from django.db import models
# Create your models here.
# 一对多建表
class Book(models.Model): # 表名
name = models.CharField(max_length=20) # name字段
price = models.IntegerField() # 字段
pub_date = models.DateField() # 字段
publish = models.ForeignKey("Publish", on_delete=models.CASCADE) #Publish 是下面的类
def __str__(self):
return self.name
class Publish(models.Model):
# 一个出版社可以出多本书,按道理一般将外键建立到多的一方
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
urls和HTML和上一章一样,此处省略!!!
views.py(核心代码):
from django.shortcuts import render, HttpResponse
# Create your views here.
from ap05.models import *
def index(request):
return render(request, "index.html")
# 一对多的添加数据方法一:
# def addbook(request):
# # 如果有外键,要加上外键的名字,而不是你创建的名字 系统默认在你创建外键名字后面加_id
# Book.objects.create(name="linux", price=120, pub_date="2017-1-1", publish_id=2)
# return HttpResponse("添加成功")
# 一对多的添加数据方法二:
def addbook(request):
# 如果害怕出错,想用自己起的外键名字的话,就用方法二
# public_obj=Publish.objects.get(name="北京出版社")
# public_obj = Publish.objects.filter(name="北京出版社")[0] # filter返回的是一个集合
# Book.objects.create(name="GIS", price=130, pub_date="2001-2-5", publish=public_obj) # 此时外键是自己起的名字
# 根据书名查该书所对应的出版社
bool_obj = Book.objects.get(name="python") # 先按照书名查一条记录
# print(bool_obj.name)
# print(bool_obj.price)
print(bool_obj.publish.name) # 中国邮电出版社
print(bool_obj.publish.city) # 北京
print(type(bool_obj.publish)) # .publish就是Publish对象
# 查询北京出版社出过的所有书籍
# 方法一:正向查询
# pub_obj=Publish.objects.filter(name="北京出版社")[0]
# ret=Book.objects.filter(publish=public_obj).values("name","price")
# print(ret)
# #方法二:反向查询
# pub_obj=Publish.objects.filter(name="北京出版社")[0]
# print(pub_obj.book_set.all()) # <QuerySet [<Book: JAVA>, <Book: C++>, <Book: C++>, <Book: GIS>, <Book: GIS>]>
# print(pub_obj.book_set.all().values("name","price"))
# print(type(pub_obj.book_set.all()))
#
return HttpResponse("添加成功")
def update(request): pass
def delete(request): pass
def select(request):
# 方法二:反向查询
pub_obj = Publish.objects.filter(name="北京出版社")[0]
# print(pub_obj.book_set.all()) # <QuerySet [<Book: JAVA>, <Book: C++>, <Book: C++>, <Book: GIS>, <Book: GIS>]>
book_list=pub_obj.book_set.all().values("name", "price")
return render(request,"index.html",{"book_list1":book_list})