多表操作
2.多表操作---绑定一对多的关系
ORM_MULTI/urls.py
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add/',views.add)
]
app01/view.py
from django.shortcuts import render,HttpResponse
from app01.models import *
# 最好这样引入视图函数,避免models调用重名覆盖!
def add(request):
# pub = Publish.objects.create(name='人民出版社',email="123@qq.com",city="北京");
# 方式一
# 为book表绑定出版社 外键出版社book ----publish
# book_obj = Book.objects.create(title="红楼梦",price=100,publishDate="2018-7-19",publish_id=1)
# 方式二 将
pub_obj = Publish.objects.filter(nid=1).first()
book_obj = Book.objects.create(title="水浒传",price=100,publishDate="2018-7-19",publish=pub_obj)
print(book_obj.publish) # 打印关联表记录(对象)
print(book_obj.publish_id) # 打印关联外键
print('email:',book_obj.publish.email)
# 查询book表title为 西游记 关联的出版社的邮箱
print('西游记邮箱:',Book.objects.filter(title="西游记").first().publish.email)
return HttpResponse('OK')
3.多表操作---多对多
app01/view.py
from django.shortcuts import render,HttpResponse
from app01.models import *
# 最好这样引入视图函数,避免models调用重名覆盖!
def add(request):
# ================ 绑定多对多的关系 =================
# Django中并不能直接找到创建的第三张关联表,但是可以利用提供的接口操作
# 可以这样理解,在Django这一层中,不存在创建的多对多的第三张关联表,
# 通过接口,操作的是相互关联的两张表对应的记录对象(或者之间的关系)
book_obj = Book.objects.create(title="兰亭集序",price=100,publishDate="2017-02-02",publish_id=1)
egon = Author.objects.get(name="egon")
alex = Author.objects.get(name="alex")
# 绑定多对多关系的API接口
book_obj.authors.add(egon,alex)
# 这句话表示,找到book_obj对象下面的authors关联对象,并将此book记录和相关联两个主键插入到关联表中,生成了两条记录
# 还有一种写法
book_obj.authors.add(1,2,3,4)
book_obj.authors.add(*[1,2,3,4]) # book_obj.authors.add(*List)
# 解除多对多的关系
book_out = Book.objects.filter(nid=10).first()
book_out.authors.remove(1,2)
book_out.authors.remove(2)
# 清楚该记录对象的所有的绑定关系
book_out.authors.clear()
# book_out是查询到的一个和多个作者绑定了关系的记录对象
book_out.authors.all() # QuerySet
# 存放所有与这本书关联的所有作者记录对象
# 打印主键为10的书籍的所有作者的名字
print(book_out.authors.all().values("name"))
return HttpResponse('OK')