今日內(nèi)容基于昨天的表模型
目錄
- 聚合查詢
- 分組查詢
- F與Q查詢
1.聚合查詢,aggregate()
queryset對象.aggregate(聚合函數(shù)('字段'))
它是queryset對象的終止句, 也就是說后面不能再點東西了
'首先導(dǎo)入各種聚合函數(shù)'
from django.db.models import Avg,Count,Max,Min,Sum
eg: 計算所有圖書的平均價格
ret=Book.objects.all().aggregate(Avg('price'))
eg: 計算圖書的最高價格,最低價格,平均價格,總價
Book.objects.all().aggregate(Max('price'),Min('price'),Avg('price'),Sum('price'))
2. 分組查詢,annotate()
總結(jié)
- 按什么分組就以它作為基表
- values在前,表示group by,也可以省略不寫,默認(rèn)為pk =====在后,表示取值,
- filter在前,表示where條件====在后表示having
- 在前與在后比較的是annotate()
首先也是導(dǎo)入各種聚合函數(shù)
from django.db.models import Avg,Count,Max,Min,Sum
eg:查詢各個作者出的書的總價格
做法: 對作者分組, 再對book的price用Sum聚合
Author.objects.all().values('name').annotate(s=Sum('book__price')).values('name','s')
Author.objects.all().annotate(s=Sum('book__price')).values('name','s')
eg:統(tǒng)計不止一個作者的圖書
Book.objects.all().values('pk').annotate(c=Count('authors')).filter(c__gt=1).values('name','c')
3. F查詢與Q查詢
1. F查詢
前面的filter里面都是用字段與一個常量比較, 如果要比較的是兩個字段呢,就需要借助F函數(shù)了
不只是filter, 其他地方也可以用, 比如update
用的時候?qū)()包裹某個字段就能拿到它的值了
現(xiàn)將Book表插入閱讀數(shù)與評論數(shù)兩個字段后執(zhí)行數(shù)據(jù)庫遷移命令
# 閱讀數(shù)
read_num=models.IntegerField(default=0)
# 評論數(shù)
commit_num=models.IntegerField(default=0)
使用F函數(shù):
導(dǎo)入F函數(shù)
from django.db.models import F
eg: 查詢評論數(shù)大于閱讀數(shù)的書
Book.objects.all().filter(commit_num__gt=F('read_num'))
eg: 把所有書的評論數(shù)加1
Book.objects.all().update(commit_num=F('commit_num')+1)
eg: 把python這本書的閱讀數(shù)減5
Book.objects.all().filter(name='python').update(reat_num=F('reat_num') - 5)
2. Q查詢
filter里面放多個條件時我們用逗號隔開他默認(rèn)是and的關(guān)系
Q函數(shù)是為了表示 與& , 或|, 非~ 的
將兩個條件分別用Q()包裹中間放與或非符號
導(dǎo)入Q函數(shù)
from django.db.models import Q
eg: 查詢作者名字是lqz或者名字是egon的書的書名和作者
Book.objects.all().filter(Q(authors__name='lqz') | Q(authors__name='egon')).values('name','authors__name')
eg: 查詢作者不是lqz的書
Book.objects.filter(~Q(authors__name='lqz'))