聚合函數分為整表聚合和分組聚合,主要用於統計(求和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}]> >>>