1. 程式人生 > >Django 多表操作2

Django 多表操作2

ice objects 查詢 clas reg 過濾 count 最低價 annotate

創建表模型和多表操作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

Django 多表操作2