W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
到目前為止,我們已經(jīng)處理了被查詢模型字段的聚合。然而,有時(shí)候想聚合的值屬于你正在查詢模型的關(guān)聯(lián)模型。
當(dāng)在聚合函數(shù)中指定要聚合的字段時(shí),Django 將允許您使用與在過(guò)濾器中引用相關(guān)字段時(shí)使用的相同的雙下劃線表示法。 然后,Django 將處理檢索和聚合相關(guān)值所需的任何表連接。
比如,要尋找每個(gè)書店提供的書籍價(jià)格區(qū)間,你可以使用這個(gè)注解(annotation):
>>> from django.db.models import Max, Min
>>> Store.objects.annotate(min_price=Min('books__price'), max_price=Max('books__price'))
這告訴 Django 去檢索 ?Store
?模型,連接(通過(guò)多對(duì)多關(guān)系) ?Book
?模型,并且聚合書籍模型的價(jià)格字段來(lái)獲取最大最小值。
相同規(guī)則應(yīng)用于 ?aggregate()
? 從句。如果你想知道任何店鋪正在銷售的任何書籍的最低最高價(jià),你可以使用這個(gè)聚合:
>>> Store.objects.aggregate(min_price=Min('books__price'), max_price=Max('books__price'))
?Join
?鏈可以根據(jù)你的需求盡可能深。比如,要提取所出售的書籍中最年輕的作者年齡,你可以寫這樣的查詢:
>>> Store.objects.aggregate(youngest_age=Min('books__authors__age'))
以類似于跨越關(guān)系的查找的方式,在與您查詢的模型或模型相關(guān)的字段上的聚合和注釋可以包括遍歷反向關(guān)系。 此處也使用相關(guān)模型的小寫名稱和雙下劃線。
例如,我們可以查詢所有出版商,并用他們各自的總圖書庫(kù)存計(jì)數(shù)器進(jìn)行注釋(注意我們?nèi)绾问褂?nbsp;'book' 來(lái)指定 Publisher -> Book 反向外鍵跳轉(zhuǎn)):
>>> from django.db.models import Avg, Count, Min, Sum
>>> Publisher.objects.annotate(Count('book'))
(查詢結(jié)果里的每一個(gè) Publisher 會(huì)有多余的屬性—— book__count 。)
我們也可以找出最古老的一本:
>>> Publisher.objects.aggregate(oldest_pubdate=Min('book__pubdate'))
(結(jié)果字典中會(huì)有一個(gè)叫 'oldest_pubdate' 的鍵。如果沒有指定這樣的別名,它將會(huì)是一個(gè)很長(zhǎng)的名字 'book__pubdate__min' 。)
它不僅僅用于外鍵,它也適用于多對(duì)多關(guān)系。比如,我們能查詢每一個(gè)作者,作者(共同)創(chuàng)作的書籍總頁(yè)數(shù)(注意我們?nèi)绾问褂?'book' 來(lái)指定 Author -> Book 反向多對(duì)多跳轉(zhuǎn)):
>>> Author.objects.annotate(total_pages=Sum('book__pages'))
(結(jié)果集里的每一個(gè) Author 會(huì)有一個(gè)額外的屬性——total_pages)如果沒有指定這樣的別名,它將會(huì)是一個(gè)很長(zhǎng)的名字 book__pages__sum)
或查詢書籍的平均評(píng)分:
>>> Author.objects.aggregate(average_rating=Avg('book__rating'))
(結(jié)果字典里會(huì)有一個(gè)叫 'average_rating' 的鍵。如果沒有指定這樣的別名,它將會(huì)是一個(gè)很長(zhǎng)的名字 'book__rating__avg'。)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: