多表操作

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')

posted @ 2018-07-20 21:25  哈哈大圣  阅读(130)  评论(0编辑  收藏  举报