內容目錄:
1、 基於對象的表查詢
2、 基於雙下劃線的查詢
3、 聚合查詢 aggregate
4、 分組查詢 annotate
1、 基於對象的表查詢
1.正向查詢 --> 意思是從含有外鍵表查詢其外鍵對應的表的字段值 --> 正向查詢容易推導
(1)查詢書籍是三國演義的出版社郵箱
book_obj = models.Book.objects.filter(title='三國演義').first()
結果:123.qq.com
(2)查詢書籍是 活着 的做者的姓名
book_obj = models.Book.objects.filter(title='活着').first()
# print(book_obj.authors) # app01.Author.None 表示查詢的數據有多個,需加上all()
print(book_obj.authors.all())
結果:<QuerySet [<Author: 做者對象的名字:jason>]>
(3)查詢做者爲jason電話號碼
user_obj = models.Author.objects.filter(name='jason').first()
print(user_obj.authordetail.phone)
結果:1110
2.反向查詢 --> 從外鍵不在本表開始查詢對應關係表的數據 --> 相對要麻煩一點
(1)查詢出版社是南方出版社出版的書籍 一對多字段的反向查詢
# 首先要肯定的是,書籍與南方出版社是有關係的,可是外鍵在書籍那邊,
# 從出版社開始查詢數據,先獲得出版社對象,在使用固定語法跨表到book表中,最後拿到數據。
publish_obj = models.Publish.objects.filter(name='南方出版社').first()
print(publish_obj.book_set) # app01.Book.None
print(publish_obj.book_set.all())
(2)查詢做者jason寫過的全部的書 多對多字段的反向查詢
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.book_set) # app01.Book.None
print(author_obj.book_set.all())
(3)查詢做者電話號碼是110的做者姓名 一對一字段的反向查詢
authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(authordetail_obj.author.name)
2、 基於雙下劃線的查詢
1.正向查詢
(1) 查詢書籍爲三國演義的出版社地址
res = models.Book.objects.filter(title='三國演義').values('publish__addr','title')
(2) 查詢書籍爲活着的做者的姓名
res = models.Book.objects.filter(title='活着').values("authors__name",'title')
(3)查詢做者爲jason的家鄉
res = models.Author.objects.filter(name='jason').values('authordetail__addr')
2.反向查詢
(1)查詢南方出版社出版的書名
res = models.Publish.objects.filter(name='南方出版社').values('book__title')
(2)查詢電話號碼爲120的做者姓名
res = models.AuthorDetail.objects.filter(phone=120).values('author__name')
(3)查詢做者爲jason的寫的書的名字
res = models.Author.objects.filter(name='jason').values('book__title')
(4)查詢書籍爲三國演義的做者的電話號碼
res = models.Book.objects.filter(title='三國演義').values('authors__authordetail__phone')
(1)查詢jason做者的手機號
# 正向查詢
res = models.Author.objects.filter(name='jason').values('authordetail__phone')
# 反向查詢
res = models.AuthorDetail.objects.filter(author__name='jason').values('phone')
(2)查詢出版社爲東方出版社的全部圖書的名字和價格
# 正向查詢
res = models.Publish.objects.filter(name='東方出版社').values('book__title','book__price')
# 反向查詢
res = models.Book.objects.filter(publish__name='東方出版社').values('title','price')
(3)查詢東方出版社出版的價格大於400的書
# 正向查詢
res = models.Publish.objects.filter(name="東方出版社",book__price__gt=400).values('book__title','book__price')
# 反向查詢
res = models.Book.objects.filter(price__gt=400,publish__name='東方出版社').values('title','price')
3、聚合查詢 aggregate
1.須要先導包
from django.db.models import Max,Min,Count,Sum,Avg
2.例子
(1)查詢全部書籍的做者個數
res = models.Book.objects.filter(pk=3).aggregate(count_num=Count('authors'))
(2)查詢全部出版社出版的書的平均價格
res = models.Publish.objects.aggregate(avg_price=Avg('book__price'))
(3)統計東方出版社出版的書籍的個數
res = models.Publish.objects.filter(name='東方出版社').aggregate(count_num=Count('book__id'))
4、分組查詢 annotate
1.例子
(1)統計每一個出版社出版的書的平均價格
res = models.Publish.objects.annotate(
avg_price=Avg('book__price')).values('name','avg_price')
(2)統計每一本書的做者個數
res = models.Book.objects.annotate(
count_num=Count('authors')).values('title','count_num')
(3)統計出每一個出版社賣的最便宜的書的價格
res = models.Publish.objects.annotate(
min_price=Min('book__price')).values('name','min_price')
(4)查詢每一個做者出的書的總價格
res = models.Author.objects.annotate(
sum_price=Sum('book__price')).values('name','sum_price')