多表查询_子查询(基于对象的跨表查询)
# 1.查询书籍主键为1的出版社
# book_obj = models.Book.objects.filter(pk=1).first()
# # 书查出版社 正向
# res = book_obj.publish
# print(res)
# print(res.name)
# print(res.addr)
# 2.查询书籍主键为2的作者
# book_obj = models.Book.objects.filter(pk=2).first()
# # 书查作者 正向
# # res = book_obj.authors # app01.Author.None
# res = book_obj.authors.all() # <QuerySet [<Author: Author object>, <Author: Author object>]>
#
# print(res)
# 3.查询作者jason的电话号码
# author_obj = models.Author.objects.filter(name='jason').first()
# res = author_obj.author_detail
# print(res)
# print(res.phone)
# print(res.addr)
"""
在书写orm语句的时候跟写sql语句一样的
不要企图一次性将orm语句写完 如果比较复杂 就写一点看一点
正向什么时候需要加.all()
当你的结果可能有多个的时候就需要加.all()
如果是一个则直接拿到数据对象
book_obj.publish
book_obj.authors.all()
author_obj.author_detail
"""
# 4.查询出版社是东方出版社出版的书
# publish_obj = models.Publish.objects.filter(name='东方出版社').first()
# 出版社查书 反向
# res = publish_obj.book_set # app01.Book.None
# res = publish_obj.book_set.all()
# print(res)
# 5.查询作者是jason写过的书
# author_obj = models.Author.objects.filter(name='jason').first()
# 作者查书 反向
# res = author_obj.book_set # app01.Book.None
# res = author_obj.book_set.all()
# print(res)
# 6.查询手机号是110的作者姓名
# author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
# res = author_detail_obj.author
# print(res.name)
"""
基于对象
反向查询的时候
当你的查询结果可以有多个的时候 就必须加_set.all()
当你的结果只有一个的时候 不需要加_set.all()
自己总结出 自己方便记忆的即可 每个人都可以不一样
"""
总结规律:
正向查询:外键字段在自己表中的就是正向
反向查询,外键字段不在自己表中的就是反向
多对多
正向查询:对象.字段名字 book.author.all() 为什么加all 因为查询可能会有多个作者 所以要加all 因为是多对多 所以都要加all
反向查询:对象.表面小写 author.book_set.all()为什么加all 因为查询可能会有多个作者 所以要加all 因为是多对多 所以都要加all
一对多
正向查询:对象.字段名字 book.publish 不加all 因为这里是多方查一方,查到的数据只有一个,外键字段在多的一方
反向查询:对象.表面小写 publish.book_set.all() 加all,因为这里是一方查多方,查到的数据可能是有多个的
一对一
正向查询:对象.字段名字
反向查询:对象.表面小写 这里反向的时候不需要加_set 因为是一对一 也不需要加all
就可以看出 多对多都需要加all,一对多反向的时候需要加all 一对一_set all都不用加
浙公网安备 33010602011771号