多表(聚合,分組,F與Q查詢)

今日內(nèi)容基于昨天的表模型

目錄

  1. 聚合查詢
  2. 分組查詢
  3. 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'))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愿卸,隨后出現(xiàn)的幾起案子灵临,更是在濱河造成了極大的恐慌,老刑警劉巖擦酌,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俱诸,死亡現(xiàn)場離奇詭異,居然都是意外死亡赊舶,警方通過查閱死者的電腦和手機睁搭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼平,“玉大人园骆,你說我怎么就攤上這事≡⒌鳎” “怎么了锌唾?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺英。 經(jīng)常有香客問我晌涕,道長,這世上最難降的妖魔是什么痛悯? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任余黎,我火速辦了婚禮,結(jié)果婚禮上载萌,老公的妹妹穿的比我還像新娘惧财。我一直安慰自己,他們只是感情好扭仁,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布垮衷。 她就那樣靜靜地躺著,像睡著了一般乖坠。 火紅的嫁衣襯著肌膚如雪搀突。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天熊泵,我揣著相機與錄音描姚,去河邊找鬼涩赢。 笑死,一個胖子當(dāng)著我的面吹牛轩勘,可吹牛的內(nèi)容都是我干的筒扒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绊寻,長吁一口氣:“原來是場噩夢啊……” “哼花墩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澄步,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冰蘑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后村缸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祠肥,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年梯皿,在試婚紗的時候發(fā)現(xiàn)自己被綠了仇箱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡东羹,死狀恐怖剂桥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情属提,我是刑警寧澤权逗,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冤议,受9級特大地震影響斟薇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恕酸,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一奔垦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧尸疆,春花似錦、人聲如沸惶岭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽按灶。三九已至症革,卻和暖如春卦睹,著一層夾襖步出監(jiān)牢的瞬間春叫,已是汗流浹背忆植。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工起暮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艇挨。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓残炮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缩滨。 傳聞我的和親對象是個殘疾皇子势就,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容