django.db.models模块中,所以再使用聚合函数时,同样需要提前导入,为了方便使用,我们采用下面的方式引入:from django.db.models import *
它的语法格式如下所示,它的返回值是一个字典,以统计结果变量名为 key,以统计值为 value:MyModel.objects.aggregate(统计结果变量名=聚合函数('列名'))
我们通过求所有书籍的价格平均值与所书籍数量来进行实例演练:
#求所有书籍的平均价格
from index.models import Book
from django.db.models import *
result =Book.objects.aggregate(myAvg=Avg('price'))
print("平均价格是:", result['myAvg'])
print("result=", result)
#result= {'myAvg': Decimal('47.800000')}
#求一共有多少本书
result =Book.objects.aggregate(MyCulate=Count('title'))
print("数据记录总个数是:", result['MyCulate'])
print("result=", result)
#result= {'MyCulate': 5}
#传递多个聚合函数一起求值
result=Book.objects.aggregate(l=Min("price"),m=Max("price"),n=Avg("retail_price"))
print("result=",result)
#result= {'l': Decimal('25.00'), 'm': Decimal('65.00'), 'n': Decimal('127.800000')}
QuerySet.annotate(结果变量名=聚合函数('列名'))
分组聚合的实现主要两个步骤:首先使用 MyModel.objects.values 获得要分组聚合的列,它的返回结果是一个 QuerySet 类型的字典,然后通过 QuerySet.annotate(变量名=聚合函数('列名')) 的方法分组聚合得到相应的结果。下面我们通过实例进行说明,通过分组聚合查询获取价格相同的书籍数量:
#在index/views.py 添加代码
from django.db.models import Count
from index.models import Book,PubName
def test_annotate(request):
# 得到所有出版社的查询集合QuerySet
bk_set = Book.objects.values('price')
# bk=Book.objects.get(id=1)
# print('书名:',bk.title,'出版社是:',bk.pub.pubname)
# 根据出版社QuerySet查询分组,出版社和Count的分组聚合查询集合
bk_count_set = bk_set.annotate(myCount=Count('price')) # 返回查询集合
for item in bk_count_set: #通过外键关联进行查询bk_set.pub.pubname
print("价格是:", item['price'], "同等价格书籍数量:", item['myCount'])
return HttpResponse('请在CMD命令行控制台查看结果')
#路由配置为忘记:path('annotate/',views.test_annotate)
最终在CMD命令行会得到如下输出:
价格是: 59.00 同等价格书籍数量: 1
价格是: 25.00 同等价格书籍数量: 1
价格是: 45.00 同等价格书籍数量: 2
价格是: 65.00 同等价格书籍数量: 1
SELECT `index_book`.`price`, COUNT(`index_book`.`price`) AS `myCount` FROM `index_book` GROUP BY `index_book`.`price` ORDER BY NULL从 SQL 语句可以得出,annotate 按照 price 分组,并且在 SELECT 中对 price 进行了计数。默认情况下,annotate 会对每一个 Model 对象计算统计值。但是,如果使用了 values 方法中指定的字段,Django 会先按照该字段对 Model 对象进行分组,再去对每个分组计算统计值。
In [41]: Book.objects.annotate(t=Max('price')).values('id','t')
Out[41]: <QuerySet [{'id': 1, 't': Decimal('59.00')}, {'id': 2, 't': Decimal('25.00')}, {'id': 3, 't': Decimal('45.00')}, {'id': 4, 't': Decimal('65.00')}, {'id': 5, 't': Decimal('45.00')}]>#按照values提供的参数分别作为键和值。
至此我们将 Django 提供的各种查询方式讲解完毕,我们用了 7 节的内容对此知识点做了详细介绍。熟练掌握这些章节的内容,对我们从数据库获取数据的操作会有很大帮助,也能够满足一些实际业务上需求。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有