建立表模型和多表操做1同樣
基於雙下劃線的一對多查詢
#查詢出版社爲北京出版社出版的全部圖書的名字,價格
ret=Publish.objects.filter(name='北京出版社').values('book__name','book__price')
print(ret)
ret=Book.objects.filter(publish__name='北京出版社').values('name','price')
print(ret)
#查詢北京出版社出版的價格大於19的書
ret=Publish.objects.filter(name='北京出版社',book__price__gt=19).values('book__name','book__price')
print(ret)
基於雙下劃線的多對多查詢
#查詢紅樓夢的全部做者名字
ret=Book.objects.filter(name='紅樓夢').values('authors__name')
print(ret)
ret=Author.objects.filter(book__name='紅樓夢').values('name')
print(ret)
#查詢圖書價格大於30的全部做者名字
ret=Book.objects.filter(price__gt=30).values('authors__name')
print(ret)
基於雙下劃線的連續跨表查詢
#查詢北京出版社出版過的全部書籍的名字以及做者的姓名
ret=Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name')
print(ret)
ret=Book.objects.filter(publish__name='北京出版社').values('name','authors__name')
print(ret)
#手機號以151開頭的做者出版過的全部書籍名稱以及出版社名稱
ret=AuthorDetail.objects.filter(phone__startswith='13').values('author__book__name','author__book__publish__name')
print(ret)
ret=Book.objects.filter(authors__authordetail__phone__startswith='13').values('name','publish__name')
print(ret)
聚合查詢aggregate
from django.db.models import Avg,Count,Max,Min,Sum
#計算全部圖書的平均價格
ret=Book.objects.all().aggregate(Avg('price'))
print(ret)
#計算圖書的最高價格
ret=Book.objects.all().aggregate(Max('price'))
print(ret)
#aggregate是queryset的終止子句
#計算圖書的最高價格,最低價格,平均價格,總價
ret=Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))
print(ret)
分組查詢annotate
#統計每一本書做者個數
ret=Book.objects.all().annotate(c=Count('authors'))
print(ret)
for r in ret:
print(r.name,'---->',r.c)
ret=Book.objects.all().annotate(c=Count('authors')).values('name','c')
print(ret)
#統計每個出版社的最便宜的書(以誰group by 就以誰爲基表)
ret=Publish.objects.all().annotate(m=Min('book__price')).values('name','m')
print(ret)
#統計每一本以py開頭的書籍的做者個數
ret1=Book.objects.all().filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')
print(ret1)
#總結: group by 誰,就以誰作基表,filter過濾,annotate取分組,values取值
#總結終極版本
#values在前,表示group by 在後,表示取值
#filter在前,表示where條件,在後表示having
#統計每一本以py開頭的書籍的做者個數--套用模板
ret2=Book.objects.all().values('name').filter(name__startswith='py').annotate(c=Count('authors')).values('name','c')
print(ret2)
#查詢各個做者出的書的總價格
ret=Author.objects.all().values('name').annotate(s=Sum('book__price')).values('name','s')
ret=Author.objects.all().annotate(s=Sum('book__price')).values('name','s')
print(ret)
#查詢名字叫lqz做者書的總價格
ret=Author.objects.all().values('pk').filter(name='lqz').annotate(s=Sum('book__price')).values('name','s')
print(ret)
#查詢全部做者寫的書的總價格大於30
ret=Author.objects.all().values('pk').annotate(s=Sum('book__price')).filter(s__gt=2).values('name','s')
ret=Author.objects.all().annotate(s=Sum('book__price')).filter(s__gt=30).values('name','s')
print(ret)
#總結終極版本
#values在前,表示group by 在後,表示取值
#filter在前,表示where條件,在後表示having
#統計不止一個做者的圖書
ret=Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c')
print(ret)
總結: group by 誰,就以誰作基表,filter過濾,annotate取分組,values取值
總結終極版本
values在前,表示group by 在後,表示取值
filter在前,表示where條件,在後表示having