基于对象的跨表查询 -- 类似于子查询
正向查询和反向查询
关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的数据叫做正向查询,反之叫做反向查询
#查询
# 一对一
# 正向查询
#1 查询崔老师的电话号
# author_obj = models.Author.objects.filter(name='崔老师').first()
# # print(author_obj.authorDetail) #辽宁峨眉山
# # print(author_obj.authorDetail.telephone) #444
# #2 反向查询
# #2 查询一下这个444电话号是谁的.
# author_detail_obj = models.AuthorDetail.objects.get(telephone='444')
# print(author_detail_obj.author) #崔老师
# print(author_detail_obj.author.name) #崔老师
''' 正向查询:Authorobj.authorDetail,对象.关联属性名称
Author----------------------------------->AuthorDetail
<-----------------------------------
反向查询:AuthorDetailobj.author ,对象.小写类名
'''
# 一对多
# 查询一下李帅的床头故事这本书的出版社是哪个
# 正向查询
book_obj = models.Book.objects.get(title='李帅的床头故事')
print(book_obj.publishs) #B哥出版社
print(book_obj.publishs.name) #B哥出版社
# B哥出版社出版社出版了哪些书
# 反向查询
pub_obj = models.Publish.objects.get(name='B哥出版社')
print(pub_obj.book_set.all()) #<QuerySet [<Book: 李帅的床头故事>, <Book: 李帅的床头故事2>]>
''' 正向查询 book_obj.publishs 对象.属性
Book ---------------------------------------------> Publish
<----------------------------------------------
反向查询 publish_obj.book_set.all() 对象.表名小写_set
'''
# 多对多
# 李帅的床头故事这本书是谁写的
# 正向查询
book_obj = models.Book.objects.get(title='李帅的床头故事')
print(book_obj.authors.all())
# 高杰写了哪些书
author_obj = models.Author.objects.get(name='高杰')
print(author_obj.book_set.all())
''' 正向查询 book_obj.authors.all() 对象.属性
Book ---------------------------------------------> Author
<----------------------------------------------
反向查询 author_obj.book_set.all() 对象.表名小写_set
'''
基于双下划綫的跨表查询 -- 连表 join
正向查询和反向查询
#查询
# 一对一
# 1. 查询崔老师的电话号
# 方式1 正向查询
# obj = models.Author.objects.filter(name='崔老师').values('authorDetail__telephone')
# print(obj) #<QuerySet [{'authorDetail__telephone': '444'}]>
# 方式2 反向查询
# obj = models.AuthorDetail.objects.filter(author__name='崔老师').values('telephone','author__age')
# print(obj) #<QuerySet [{'telephone': '444'}]>
# 2. 哪个老师的电话是444
# 正向
# obj = models.Author.objects.filter(authorDetail__telephone='444').values('name')
# print(obj)
# 反向
# obj = models.AuthorDetail.objects.filter(telephone='444').values('author__name')
# print(obj)
# 一对多
# 查询一下李帅的床头故事这本书的出版社是哪个
# obj = models.Book.objects.filter(title='李帅的床头故事').values('publishs__name')
# print(obj) #<QuerySet [{'publishs__name': 'B哥出版社'}]>
# obj = models.Publish.objects.filter(book__title='李帅的床头故事').values('name')
# obj = models.Publish.objects.filter(xx__title='李帅的床头故事').values('name')
# print(obj)
# B哥出版社出版社出版了哪些书
# obj = models.Publish.objects.filter(name='B哥出版社').values('book__title')
# print(obj) #<QuerySet [{'book__title': '李帅的床头故事'}, {'book__title': '李帅的床头故事2'}]>
# obj = models.Book.objects.filter(publishs__name='B哥出版社').values('title')
# print(obj) #<QuerySet [{'title': '李帅的床头故事'}, {'title': '李帅的床头故事2'}]>
# 李帅的床头故事这本书是谁写的
# obj = models.Book.objects.filter(title='李帅的床头故事').values('authors__name')
# print(obj)
# obj = models.Author.objects.filter(book__title='李帅的床头故事').values('name')
# print(obj) #<QuerySet [{'name': '高杰'}, {'name': '崔老师'}]>
#高杰写了哪些书
# obj = models.Book.objects.filter(authors__name='高杰').values('title')
# print(obj)
# obj = models.Author.objects.filter(name='高杰').values('book__title')
# print(obj)
#进阶的
# B哥出版社 出版的书的名称以及作者的名字
# obj = models.Book.objects.filter(publishs__name='B哥出版社').values('title','authors__name')
# print(obj)
#<QuerySet [{'title': '李帅的床头故事', 'authors__name': '高杰'}, {'title': '李帅的床头故事', 'authors__name': '崔老师'}, {'title': '李帅的床头故事2', 'authors__name': '崔老师'}, {'title': '李帅的床头故事2', 'authors__name': '王涛'}]>
'''
SELECT app01_book.title,app01_author.name from app01_publish INNER JOIN app01_book on app01_publish.id=app01_book.publishs_id
INNER JOIN app01_book_authors on app01_book.nid = app01_book_authors.book_id INNER JOIN app01_author
ON app01_author.id = app01_book_authors.author_id where app01_publish.name='B哥出版社';
:param request:
:return:
'''
# obj = models.Publish.objects.filter(name='B哥出版社').values('book__title','book__authors__name')
# print(obj)
# obj = models.Author.objects.filter(book__publishs__name='B哥出版社').values('name','book__title')
# print(obj)
# authorDetail author book publish
# 手机号以4开头的作者出版过的所有书籍名称以及出版社名称
# ret = models.AuthorDetail.objects.filter(telephone__startswith='4').values('author__book__title','author__book__publishs__name')
# print(ret)
#QuerySet [{'author__book__title': '李帅的床头故事', 'author__book__publishs__name': 'B哥出版社'}, {'author__book__title': '李帅的床头故事2', 'author__book__publishs__name': 'B哥出版社'}]>
#查询一下B哥出版社出版了哪些书
# obj = models.Publish.objects.filter(name='B哥出版社').first()
# print(obj.xx.all())
聚合
from django.db.models import Avg,Max,Min,Sum,Count
# 计算所有图书的平均价格
# obj = models.Book.objects.all().aggregate(a=Avg('price'),m=Max('price')) #aggregate()是QuerySet 的一个终止子句,得到的是个字典.
# print(obj['m'] - 2) #{'price__avg': 2.833333}