Django ORM 聚合查詢和分組查詢實現(xiàn)詳解
models.py:
from django.db import models
# 出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64, null=False, unique=True)
def __str__(self):
return "<Publisher object: {}>".format(self.name)
# 書籍
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
price = models.DecimalField(max_digits=5, decimal_places=2, default=00.00) # 最長位數(shù)為 5,小數(shù)位數(shù)為 2,默認值為 00.00
publisher = models.ForeignKey(to="Publisher", null=True) # 把 null 設(shè)置為 True
def __str__(self):
return "<Book object: {}>".format(self.title)
# 作者
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=16, null=False, unique=True)
book = models.ManyToManyField(to="Book") # 多對多關(guān)聯(lián) Book 表,ORM 會自動生成第 3 張表
def __str__(self):
return "<Author object: {}>".format(self.name)
book 表:

修改 price

聚合查詢:
aggregate():返回一個包含一些鍵值對的字典。
鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照字段和聚合函數(shù)的名稱自動生成出來的。
orm.py:
import os
if __name__ == '__main__':
# 加載 Django 項目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 導(dǎo)入 Django,并啟動 Django 項目
import django
django.setup()
from app01 import models
# 聚合查詢需要導(dǎo)入的函數(shù)
from django.db.models import Avg, Sum, Max, Min, Count
# 計算所有書籍 price 的平均值
avg_ret = models.Book.objects.all().aggregate(Avg("price"))
print(avg_ret)
# 計算所有書籍 price 的總和
sum_ret = models.Book.objects.all().aggregate(Sum("price"))
print(sum_ret)
# 計算所有書籍 price 的最大值
max_ret = models.Book.objects.all().aggregate(Max("price"))
print(max_ret)
# 計算所有書籍 price 的最小值
min_ret = models.Book.objects.all().aggregate(Min("price"))
print(min_ret)
# 計算所有書籍 price 的個數(shù)
count_ret = models.Book.objects.all().aggregate(Count("price"))
print(count_ret)
運行結(jié)果:

生成的是字典類型
分組:
orm.py:
import os
if __name__ == '__main__':
# 加載 Django 項目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 導(dǎo)入 Django,并啟動 Django 項目
import django
django.setup()
from app01 import models
from django.db.models import Count
# 查詢每一本書的作者個數(shù)
ret = models.Book.objects.all().annotate(author_num=Count("author")) # 返回的是 book 對象,annotate(author_num) 相當于讓 book 對象多了一個 author_num 字段
print(ret)
for book in ret:
print("書名:{},作者數(shù):{}".format(book.title, book.author_num))
運行結(jié)果:

這里的 book.annotate(author_num) 相當于讓 book 對象多了一個 author_num 字段,但并不是在數(shù)據(jù)庫中多了一個字段
orm.py:
import os
if __name__ == '__main__':
# 加載 Django 項目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 導(dǎo)入 Django,并啟動 Django 項目
import django
django.setup()
from app01 import models
from django.db.models import Count
# 查詢作者數(shù)大于 1 的書
ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1)
print(ret)
運行結(jié)果:

orm.py:
import os
if __name__ == '__main__':
# 加載 Django 項目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 導(dǎo)入 Django,并啟動 Django 項目
import django
django.setup()
from app01 import models
from django.db.models import Sum
# 查詢各個作者出的書的總價格
ret = models.Author.objects.all().annotate(price_sum=Sum("book__price")) # 獲取所有 author 表數(shù)據(jù)并添加 price_sum 字段
for i in ret:
print(i, i.name, i.price_sum) # 打印所有 author 對象、 author 的 name 字段、price_sum 字段 的數(shù)據(jù)
# 打印 author 表的所有 id、name、price_sum 字段數(shù)據(jù)
print(ret.values_list("id", "name", "price_sum"))
運行結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題
今天小編就為大家分享一篇解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
VSCode運行或調(diào)試python文件無反應(yīng)的問題解決
這篇文章主要給大家介紹了關(guān)于VSCode運行或調(diào)試python文件無反應(yīng)的問題解決,使用VScode編譯運行C/C++沒有問題,但是運行Python的時候出了問題,所以這里給大家總結(jié)下,需要的朋友可以參考下2023-07-07
python使用paramiko模塊通過ssh2協(xié)議對交換機進行配置的方法
今天小編就為大家分享一篇python使用paramiko模塊通過ssh2協(xié)議對交換機進行配置的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07

