十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
需要導(dǎo)入模塊:from django.db.models import Max, Min, Sum, Count, Avg
10年積累的成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有大姚免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
關(guān)鍵語(yǔ)法:aggregate(聚合結(jié)果別名 = 聚合函數(shù)(參數(shù)))
查詢結(jié)果:使用聚合函數(shù),從每一個(gè)組中獲取結(jié)果:字典
注意點(diǎn):
1 聚合函數(shù)必須在分組之后才能使用
2 沒(méi)有分組,即默認(rèn)整體就是一組
3 查詢結(jié)果為 普通字典
"""
聚合查詢通常情況下都是配合分組一起使用的
只要是跟數(shù)據(jù)庫(kù)相關(guān)的模塊
基本上都在 django.db.models 里面
上述沒(méi)有那么應(yīng)該在 django.db里面
"""
from django.db.models import Max, Min, Sum, Count, Avg
# 1 所有書(shū)的平均價(jià)格
res = models.Book.objects.aggregate(Avg('price'))
print(res)
# 2 上述方法一次性使用
res = models.Book.objects.aggregate(Max('price'), Min('price'), Sum('price'), Count('pk'), Avg('price'))
print(res)
1 關(guān)鍵字:annotate
2 默認(rèn)以當(dāng)前表id分組,并使用聚合函數(shù)在組內(nèi)進(jìn)行聚合計(jì)算,得到結(jié)果作為查詢結(jié)果中組內(nèi)的屬性
from django.db.models import Max, Min, Sum, Count, Avg
# 1 統(tǒng)計(jì)每一本書(shū)的作者個(gè)數(shù)
res = models.Book.objects.annotate() # models后面點(diǎn)什么 就是按什么分組
res1 = models.Book.objects.annotate(author_num = Count('authors')).values('title', 'author_num')
res2 = models.Book.objects.annotate(author_num = Count('authors__nid')).values('title', 'author_num')
print(res, res1, res3)
"""
author_num 自己定義的字段 用來(lái)存儲(chǔ)統(tǒng)計(jì)出來(lái)的每本書(shū)對(duì)應(yīng)的作者個(gè)數(shù)
"""
# 2 統(tǒng)計(jì)每個(gè)出版社賣(mài)的最便宜的書(shū)的價(jià)格
res = models.Publish.objects.annotate(min_price = Min('book__price')).values('name', 'min_price')
print(res)
# 3 統(tǒng)計(jì)不止一個(gè)作者的圖書(shū)
# 先按照?qǐng)D書(shū)分組 求每一本書(shū)對(duì)應(yīng)的作者個(gè)數(shù)
# 過(guò)濾出不止一個(gè)作者的圖書(shū)
res = models.Book.objects.annotate(author_num = Count('authors')).filter(author_num__gt = 1).values('title', 'author_num')
print(res)
# 4 查詢每個(gè)作者出的書(shū)的總價(jià)格
res = models.Author.objects.annotate(sum_price = Sum('book__price')).values('name', 'sum_price')
print(res)
# 5 統(tǒng)計(jì) price大于150元 的書(shū)籍的作者個(gè)數(shù)
res = models.Book.objects.filter(price__gt = 150).annotate(num_authors = Count('authors')).values('title', 'num_authors')
print(res)
# F查詢
"""
能夠幫助你直接獲取到表中某個(gè)字段對(duì)應(yīng)的數(shù)據(jù)
"""
from django.db.models import F
# 1 將所有書(shū)籍的價(jià)格提升 10 塊
models.Book.objects.update(price = F('price') + 10)
# 2 將 django 書(shū)的名稱后面加上 ' web' 字
"""
在操作字符類型的數(shù)據(jù)的時(shí)候 F不能夠直接做到字符串的拼接
"""
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.filter(title = "django").update(title = Concat(F('title'), Value(' web')))
# Q查詢
"""
filter括號(hào)內(nèi)多個(gè)參數(shù)是and關(guān)系
"""
from django.db.models import Q
# Q包裹逗號(hào)分割 還是and關(guān)系
res1 = models.Book.objects.filter(Q(price__lt = 300), Q(price__gt = 400))
print(res1)
# | or關(guān)系
res2 = models.Book.objects.filter(Q(pub_date__lt = '2020-01-01') | Q(price__gt = 300))
print(res2)
# ~ not關(guān)系
res3 = models.Book.objects.filter( ~ Q(pub_date__lt = '2020-01-01') | Q(price__lt = 200))
print(res3) #
# Q的高階用法 能夠?qū)⒉樵儣l件的左邊也變成字符串的形式
# 提前生成 Q 對(duì)象,并使用 append方法 添加條件
q = Q()
q.connector = 'or'
q.children.append(('pub_date__lt', '2020-01-01'))
q.children.append(('price__lt', 200))
res = models.Book.objects.filter(q) # 默認(rèn)是and關(guān)系
print(res)
1 定義字段時(shí),指定參數(shù) choices
2 choices 的值為元組套元組(事先定義好,一般在該表類中定義該字段之前定義)
3 每一個(gè)元組存放兩個(gè)元素,形成一種對(duì)應(yīng)關(guān)系
4 往數(shù)據(jù)庫(kù)中存值時(shí),該字段的值存為元組第一個(gè)元素即可
5 通過(guò) 對(duì)象.get_字段名_display()獲取對(duì)應(yīng)的元組第二個(gè)元素值,當(dāng)沒(méi)有對(duì)應(yīng)關(guān)系時(shí),返回的是它本身
示例:
# 定義一個(gè) UserTest 表
class UserTest(models.Model):
name = models.CharField(max_length = 64)
gender_choices = ((1, '男'),(2, '女'),(3, '其他'))
gender = models.IntegerField(choices = gender_choices)
# 同步遷移到數(shù)據(jù)庫(kù)
python manage.py makemigrations
python manage.py migrate
# 在 test.py 配置測(cè)試環(huán)境
# 錄入數(shù)據(jù)
models.UserTest.objects.create(name = '小微', gender = 1)
models.UserTest.objects.create(name = '小芬', gender = 2)
models.UserTest.objects.create(name = '小桃', gender = 3)
models.UserTest.objects.create(name = '小月', gender = 4)
# 驗(yàn)證choices
for user_obj in models.UserTest.objects.all():
print(user_obj.gender, end=' ')
print(user_obj.get_gender_display())
'''
1 男
2 女
3 其他
4 4
'''