第五章、Django之模型层----多表查询

第五章、Django之模型层----多表查询

一、一对多字段增删改查

1.增

第一种
# models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)  # publish_id直接传出版社主键值
第二种
# publish_obj = models.Publish.objects.filter(pk=2).first()
# models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj)  # publish直接传出版社数据对象

2.查

# book_obj = models.Book.objects.filter(pk=1).first()
# print(book_obj.publish)  # 获取到当前所对应的出版社对象
# print(book_obj.publish_id)  # 获取到的就是表中的实际字段

3.改

 # models.Book.objects.filter(pk=1).update(publish_id=3)
 # publish_obj = models.Publish.objects.filter(pk=2).first()
 # models.Book.objects.filter(pk=1).update(publish=publish_obj)

4. 删除

 # models.Publish.objects.filter(pk=2).delete()
 # 默认也是级联更新 级联删除

二、多对多的增删改查

1. 增

 # 给主键为3的书籍添加两个作者 1 2
    # book_obj = models.Book.objects.filter(pk=3).first()
    # # print(book_obj.authors)  # 就相当于 已经在书籍和作者的关系表了
    # # book_obj.authors.add(1)
    # # book_obj.authors.add(2,3)
    # author_obj = models.Author.objects.filter(pk=1).first()
    # author_obj1 = models.Author.objects.filter(pk=2).first()
    # # book_obj.authors.add(author_obj)
    # book_obj.authors.add(author_obj,author_obj1)
    """
add() 括号内既可以传数字也可以传数据对象
    并且都支持传多个
 """

2. 改

第一种
# book_obj = models.Book.objects.filter(pk=3).first()
# # book_obj.authors.set([3,]) 原本有3的数据就不改动,会删除外键3以外的数据
# # book_obj.authors.set([1,3]) 原本有1和3的数据就不改动,会删除外键1和3以外的数据,
第二种
# author_obj = models.Author.objects.filter(pk=1).first()
# author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.set((author_obj,))
# book_obj.authors.set((author_obj,author_obj1))
"""
set() 括号内 既可以传数字也传对象 
并且也是支持传多个的
但是需要注意 括号内必须是一个可迭代对象
"""

3. 删

 第一种
 #book_obj = models.Book.objects.filter(pk=3).first()
 # # book_obj.authors.remove(2) #删除由作者id=3写的书籍
 # # book_obj.authors.remove(1,2) #删除由作者id=1和id=3写的书籍
 第二种
 # author_obj = models.Author.objects.filter(pk=1).first()
 # author_obj1 = models.Author.objects.filter(pk=2).first()
 # # book_obj.authors.remove(author_obj)
 # book_obj.authors.remove(author_obj,author_obj1)
 """
 remove() 括号内 既可以传数字也传对象 
 并且也是支持传多个的
 """
 # 清空
 # book_obj = models.Book.objects.filter(pk=3).first()
 # book_obj.authors.clear()
 """clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""

三、ORM跨表查询

1.子查询
2.连表查询

四、正反向的概念

外键字段在谁那儿 由谁查谁就是正向
        
谁手里有外键字段 谁就是正向查
没有外键字段的就是反向
书籍对象 查  出版社    外键字段在书籍       正向查询
出版社 查 书籍         外键字段在书籍       反向查询


正向查询按字段
反向查询按表名小写 ...

1.基于对象的跨表查询 子查询


    # 1.查询书籍是python入门的出版社名称
        # book_obj = models.Book.objects.filter(title='python入门').first()
        # # 正向查询按字段
        # print(book_obj.publish.name)
        # print(book_obj.publish.addr)
    # 2.查询书籍主键是6的作者姓名
        # book_obj = models.Book.objects.filter(pk=6).first()
        # # print(book_obj.authors)  # app01.Author.None
        # print(book_obj.authors.all())
    # 3.查询作者是jason的手机号
        # author_obj = models.Author.objects.filter(name='jason').first()
        # print(author_obj.author_detail.phone)
        # print(author_obj.author_detail.addr)
"""
    正向查询 按字段 
    当该字段所对应的数据有多个的时候 需要加.all()
    否者点外键字段直接就能够拿到数据对象
"""

    # 4.查询出版社是东方出版社出版过的书籍
        # publish_obj = models.Publish.objects.filter(name='东方出版社').first()
        # # print(publish_obj.book_set)  # app01.Book.None
        # print(publish_obj.book_set.all())
    # 5.查询作者是jason写过的所有的书
        # author_obj = models.Author.objects.filter(name='jason').first()
        # # print(author_obj.book_set)  # app01.Book.None
        # print(author_obj.book_set.all())
    # 6.查询手机号是110的作者
        # author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
        # print(author_detail_obj.author)
        # print(author_detail_obj.author.name)
        # print(author_detail_obj.author.age)
    """
        反向查询按表名小写 
        什么时候需要加_set
        当查询的结果可以是多个的情况下 需要加_set.all()
        什么时候不需要加_set
        当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
    """
    # 7.查询书籍是python入门的作者的手机号
        # book_obj = models.Book.objects.filter(title='python入门').first()
        # print(book_obj.authors.all())

2.基于双下划綫的跨表查询 连表查询

	"""
    MySQL
        left join
        inner join
        right join
        union
    """
# 1.查询书籍是python入门的出版社名称
    # 正向
    # res = models.Book.objects.filter(title='python入门').values('publish__name')
    # print(res)
    # 反向
    # res = models.Publish.objects.filter(book__title='python入门').values('name')
    # print(res)


# 2.查询作者是jason的手机号码
    # 正向
    # res1 = models.Author.objects.filter(name='jason').values('author_detail__phone')
    # print(res1)
    # 反向
    # res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
    # print(res)
# 3.查询手机号是120的作者姓名

    # res2 = models.AuthorDetail.objects.filter(phone=120).values('author__name')
    # print(res2)
    # res = models.Author.objects.filter(author_detail__phone=120).values('name','author_detail__addr')
    # print(res)


# 4.查询出版社是东方出版社出版的书籍名称
    # res = models.Publish.objects.filter(name='东方出版社').values('book__title','addr')
    # print(res)
    # 5.查询作者是jason的写过的书的名字和价格
    # res = models.Author.objects.filter(name='jason').values('book__title','book__price')
    # print(res)

# 5.查询书籍是python入门的作者的手机号
    # res = models.Book.objects.filter(title='python入门').values('authors__author_detail__phone')
    # print(res)
posted @ 2019-10-24 21:58  得淼  阅读(155)  评论(0编辑  收藏  举报