聚合函数分为整表聚合和分组聚合,主要用于统计(求和Sum,平均值Avg,计数Count,最大值Max,最小值Min)
使用聚合函数的前提需要导入:from django.db.models import *
语法:MyModel.objects.aggregate(结果变量名=聚合函数('列'))
1整表聚合示例:
使用sql语句统计book表内有多少条数据:
mysql> select count(*) from book; +----------+ | count(*) | +----------+ | 4 | +----------+ 1 row in set (0.01 sec) mysql> select count(*) as hello from book; +-------+ | hello | +-------+ | 4 | +-------+ 1 row in set (0.00 sec) mysql>
用DjangoORM实现:
(venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import Book >>> from django.db.models import * >>> b1 = Book.objects.aggregate(hello=Count("id")) >>> b1 {'hello': 4}
2分组聚合示例:
对某个表的分组按照一定的规则进行统计:
使用出版社字段这个条件,对Book表进行统计,并过滤出数量大于1的出版社:
分析:
根据”列“统计”表“,首先需要使用values()方法对表进行分组,目的是为了获取这个表的queryset对象
然后使用聚合函数.annotate()对这个queryset进行统计,
先分组 ##按照pub这个列对Book表进行分组 (venv) D:\PycharmProjects\mysite3>python manage.py shell >>> from bookstore.models import Book >>> pub_set=Book.objects.values('pub') >>> print(pub_set) <QuerySet [{'pub': '清华大学出版社'}, {'pub': '清华大学出版社'}, {'pub': '机械工业出版社'}, {'pub': '机械工业出版社'}]> >>> 再聚合 #用.annotate()方法对上面的pub_set进行统计: >>> from django.db.models import * >>> pub_count_set=pub_set.annotate(myCount=Count('pub')) >>> print(pub_count_set) <QuerySet [{'pub': '清华大学出版社', 'myCount': 2}, {'pub': '机械工业出版社', 'myCount': 2}]> >>> #统计聚合结果并过滤出数量大于1的数据 >>> result = pub_set.annotate(res=Count('id')).filter(res__gt=1) >>> print(result) <QuerySet [{'pub': '清华大学出版社', 'res': 2}, {'pub': '机械工业出版社', 'res': 2}]> >>>