Django 聚合查詢 分組查詢 F與Q查詢

一、聚合查詢


需要導入模塊:from django.db.models import Max, Min, Sum, Count, Avg

10年積累的成都網站制作、成都做網站、外貿營銷網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有大姚免費網站建設讓你可以放心的選擇與我們合作。

關鍵語法:aggregate(聚合結果別名 = 聚合函數(參數))

查詢結果:使用聚合函數,從每一個組中獲取結果:字典

注意點:

1 聚合函數必須在分組之后才能使用

2 沒有分組,即默認整體就是一組

3 查詢結果為 普通字典

"""
    聚合查詢通常情況下都是配合分組一起使用的
    只要是跟數據庫相關的模塊 
      基本上都在 django.db.models 里面
      上述沒有那么應該在 django.db里面
"""
from django.db.models import Max, Min, Sum, Count, Avg
# 1 所有書的平均價格
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 關鍵字:annotate

2 默認以當前表id分組,并使用聚合函數在組內進行聚合計算,得到結果作為查詢結果中組內的屬性

from django.db.models import Max, Min, Sum, Count, Avg
# 1 統計每一本書的作者個數
res = models.Book.objects.annotate()  # models后面點什么 就是按什么分組
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 自己定義的字段 用來存儲統計出來的每本書對應的作者個數
"""

# 2 統計每個出版社賣的最便宜的書的價格
res = models.Publish.objects.annotate(min_price = Min('book__price')).values('name', 'min_price')
print(res)

# 3 統計不止一個作者的圖書
#     先按照圖書分組 求每一本書對應的作者個數
#     過濾出不止一個作者的圖書
res = models.Book.objects.annotate(author_num = Count('authors')).filter(author_num__gt = 1).values('title', 'author_num')
print(res)

# 4 查詢每個作者出的書的總價格
res = models.Author.objects.annotate(sum_price = Sum('book__price')).values('name', 'sum_price')
print(res)

# 5 統計 price大于150元 的書籍的作者個數
res = models.Book.objects.filter(price__gt = 150).annotate(num_authors = Count('authors')).values('title', 'num_authors')
print(res)

三、F與Q查詢


# F查詢
"""
能夠幫助你直接獲取到表中某個字段對應的數據
"""
from django.db.models import F

# 1 將所有書籍的價格提升 10 塊
models.Book.objects.update(price = F('price') + 10)


# 2 將 django 書的名稱后面加上 ' web' 字
"""
在操作字符類型的數據的時候 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括號內多個參數是and關系
"""
from django.db.models import Q

# Q包裹逗號分割 還是and關系
res1 = models.Book.objects.filter(Q(price__lt = 300), Q(price__gt = 400))  
print(res1)

# | or關系
res2 = models.Book.objects.filter(Q(pub_date__lt = '2020-01-01') | Q(price__gt = 300)) 
print(res2)

# ~ not關系
res3 = models.Book.objects.filter( ~ Q(pub_date__lt = '2020-01-01') | Q(price__lt = 200)) 
print(res3)  # <QuerySet []>

# Q的高階用法  能夠將查詢條件的左邊也變成字符串的形式
# 提前生成 Q 對象,并使用 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)  # 默認是and關系
print(res)

四、特殊參數choices


1 定義字段時,指定參數 choices

2 choices 的值為元組套元組(事先定義好,一般在該表類中定義該字段之前定義)

3 每一個元組存放兩個元素,形成一種對應關系

4 往數據庫中存值時,該字段的值存為元組第一個元素即可

5 通過 對象.get_字段名_display()獲取對應的元組第二個元素值,當沒有對應關系時,返回的是它本身

示例:

# 定義一個 UserTest 表
class UserTest(models.Model):
    name = models.CharField(max_length = 64)
    gender_choices = ((1, '男'),(2, '女'),(3, '其他'))
    gender = models.IntegerField(choices = gender_choices)
    
# 同步遷移到數據庫
python manage.py makemigrations
python manage.py migrate

# 在 test.py 配置測試環境
# 錄入數據
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)

# 驗證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
'''

文章名稱:Django 聚合查詢 分組查詢 F與Q查詢
本文路徑:http://m.kartarina.com/article6/dsogsig.html

成都網站建設公司_創新互聯,為您提供用戶體驗、網站排名、網站設計、服務器托管、網站改版面包屑導航

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

綿陽服務器托管
主站蜘蛛池模板: 性无码免费一区二区三区在线| 亚洲国产精品无码久久一线| 99久久人妻无码精品系列蜜桃| 中文字幕无码高清晰| 人妻中文字幕AV无码专区| 国产精品一区二区久久精品无码 | 亚洲AV无码专区国产乱码4SE| 午夜不卡无码中文字幕影院| 国产精品免费看久久久无码 | 亚洲AV无码一区二区三区牲色| 亚洲日韩VA无码中文字幕| 亚洲中文无码av永久| 国产精品毛片无码| 西西人体444www大胆无码视频| 亚洲va中文字幕无码久久| 无码精品久久一区二区三区| 国产成人无码免费看视频软件| 国产成人A亚洲精V品无码| 男人av无码天堂| 亚洲熟妇无码八V在线播放| 亚洲va中文字幕无码久久| AV无码小缝喷白浆在线观看| 精品人妻中文无码AV在线| 中文字幕亚洲精品无码| 久久久久亚洲av无码尤物| 潮喷无码正在播放| 无码精品人妻一区| 18禁无遮挡无码网站免费| 无码射肉在线播放视频| 亚洲AV无码男人的天堂| 亚洲精品GV天堂无码男同| 免费A级毛片无码无遮挡内射| 久久无码无码久久综合综合| 日韩精品无码免费专区网站| 亚洲伊人成无码综合网| 亚洲午夜福利精品无码 | 日韩少妇无码喷潮系列一二三| 亚洲日韩精品A∨片无码加勒比| 无码人妻丝袜在线视频| 少妇特殊按摩高潮惨叫无码| 亚洲av无码片vr一区二区三区|