Django(part27)--聚合查询

学习笔记,仅供参考




数据库的操作(CRUD操作)


聚合查询


聚合查询是指对某个数据表中的某个字段的数据计算其统计量,比如,求出bookstore_book数据表中书的平均价格,查询所有书的总个数等等等。


不分组聚合


不带分组的聚合查询是指导将全部数据进行集中统计查询


  • 用法
from django.db.models import *
Entry.objects.aggregate(结果变量名=聚合函数('列'))
#聚合函数
#Sum, Avg, Count, Max, Min

  • 返回结果

结果变量名组成的字典,格式为:

{"结果变量名": 值}
  • 举个例子

我们先看一下bookstore_author数据表:

mysql> select * from bookstore_author;
+----+--------+-----+----------------------+
| id | name   | age | email                |
+----+--------+-----+----------------------+
|  1 | 山羊   |  19 | [email protected] |
|  2 | 小黄   |  10 | [email protected]    |
|  5 | 小黑   |  12 | [email protected]    |
|  6 | 小白   |  18 | [email protected]    |
|  7 | 山羊哥 |  27 | [email protected]    |
+----+--------+-----+----------------------+
5 rows in set (0.00 sec)

在Django shell中敲入如下命令:

from bookstore import models
from django.db.models import *
result = models.Author.objects.aggregate(myAvg=Avg('age'))
print("平均年龄是:", result['myAvg'])
print("result=", result)

得到结果:

平均年龄是: 17.2
result= {'myAvg': 17.2}

分组聚合


分组聚合是指计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即查询集的每一项生成聚合。

分组聚合的步骤:

  • 首先,通过先用查询结果Entry.object.values('列1', '列2') 查找到要分组聚合的列
  • 再通过返回结果的 QuerySet.annotate(结果变量名=聚合函数('列')) 的方法分组聚合得到分组结果

  • 举个例子

我们在Django shell中敲入如下代码:

from django.db.models import Count
from . import models
#得到所有出版社的查询集合QuerySet
pub_set = models.Book.objects.values('pub')
#根据出版社查询分组,出版社和Count的分组聚合查询集合
pub_count_set = pub_set.annotate(myCount=Count('pub'))
#返回查询集合
for item in pub_count_set:
    print("出版社:", item['pub'], "图书有:", item['myCount'])

输出结果:

出版社: 清华大学出版社 图书有: 2
出版社: 机械工业出版社 图书有: 1
出版社: 人民邮电出版社 图书有: 2
出版社: 黑山羊出版社 图书有: 1

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/106883884