Django學(xué)習(xí)筆記

1.Django Aggregation聚合

#平均值

from django.db.models import Avg

Book.objects.all().aggregate(Avg('price'))

#最大值

from django.db.models import Max

Book.objects.all().aggregate(Max('price'))

# 為每個publisher添加個num_books屬性,即每個pulisher出版的book的數(shù)量.

from django.db.models import Count

pubs=Publisher.objects.annotate(num_books=Count('book'))


Django有兩種方法來生成聚合

第一種方法是為整個QuerySet生成聚合值:

? ??函數(shù)aggregate()的參數(shù)是一系列聚合函數(shù)aggregate functions:

第二種是為查詢集的每個對象生成聚合值

? ??每個對象的總結(jié)可以用方法annotate()生成

django 中 annotate和aggregate的區(qū)別:

aggregate 計算整個queryset的值,相當(dāng)于count(). Annotate 對于 queryset 中的每個值在指定的屬性上進(jìn)行匯總,相當(dāng)于group_by.


values():注解annotate是添加到每一個對象上的,一個執(zhí)行了注解操作的查詢集 QuerySet 所返回的結(jié)果中,每個對象都添加了一個注解值。但是,如果使用了values()從句,它就會限制結(jié)果中列的范圍,對注解賦值的方法就會完全不同。就不是在原始的 QuerySet 返回結(jié)果中對每個對象中添加注解,而是根據(jù)定義在 values() 從句中的字段組合對先結(jié)果進(jìn)行唯一的分組,再根據(jù)每個分組算出注解值,這個注解值是根據(jù)分組中所有的成員計算而得的


values_list 獲取元組形式結(jié)果

2.1 比如我們要獲取作者的 name 和 qq

????????authors = Author.objects.values_list('name', 'qq')

????????如果只需要 1 個字段,可以指定flat=True

????????Author.objects.values_list('name',flat=True)

3. values 獲取字典形式的結(jié)果

3.1 比如我們要獲取作者的 name 和 qq

????Author.objects.values('name', 'qq')

注意:

1. values_list 和 values 返回的并不是真正的 列表 或 字典,也是 queryset,他們也是 lazy evaluation 的(惰性評估,通俗地說,就是用的時候才真正的去數(shù)據(jù)庫查)

2. 如果查詢后沒有使用,在數(shù)據(jù)庫更新后再使用,你發(fā)現(xiàn)得到在是新內(nèi)容?。?!如果想要舊內(nèi)容保持著,數(shù)據(jù)庫更新后不要變,可以 list 一下

3. 如果只是遍歷這些結(jié)果,沒有必要 list 它們轉(zhuǎn)成列表(浪費(fèi)內(nèi)存,數(shù)據(jù)量大的時候要更謹(jǐn)慎?。。。?/p>


4. extra?實(shí)現(xiàn) 別名,條件,排序等

extra 中可實(shí)現(xiàn)別名,條件,排序等,后面兩個用 filter, exclude 一般都能實(shí)現(xiàn),排序用 order_by 也能實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容