数据聚合函数

发布于 2020-01-14 19:34:06   阅读量 139  点赞 0  

  对于ORM模型可以使用聚合函数,得到数据运算后的结果。Django的聚合函数都是通过aggregateannotate方法调用的。

  • 所有聚合函数都位于django.db.models下。
  • 聚合函数不能单独执行,需放在可以执行聚合函数的aggregateannotate方法中去执行。
  • 聚合函数以字符串的形式传入调用函数字段。
  • aggregate不会返回一个QuerySet对象,而是返回一个字典。
  • 通过aggregate执行的聚合函数,返回一个存储结果的字典,字典键名为系统自动生成的字段名__聚合函数名(全小写)。若想为聚合函数返回的结果取名,则可以在使用函数的时候传递关键字参数,参数的名字为返回结果的名字(即字典的键名)。
  • 在使用聚合函数的时候,仍可使用反向引用,常用于计算与当前模型相关联的模型的聚合结果

    在使用聚合函数时使用反向引用,其实现方法与反向引用一样,即传入related_name__field


以下为常用的聚合函数:

1.Avg

 求平均值,如想获取所有图书的平均价格,则可使用以下代码实现:

from django.db.models import Avg
 result = Book.objects.aggregate(my_avg=Avg('price'))
 print(result["my_avg"])


2.Count

 获取指定对象的个数,如想获取Book表中图书的数目,则可使用:

 from django.db.models import Count
 result = Book.objects.aggregate(book_num=Count('id'))

Count函数还有一个参数distinctt,默认为False,若为True,则统计的时候不会计算重复的值,如:

 from djang.db.models import Count
 result = Author.objects.aggregate(count=Count('email',distinct=True))


3.Max与Min

 获取指定对象的最大值与最小值,如想获取Author中最大与最小的年龄,则可以:

from django.db.models import Max,Min
result = Author.objects.aggregate(Max('age'),Min('age'))


4.Sum

 求指定对象的总会,如要求图书销售总额,则可以:

from djang.db.models import Sum
result = Book.objects.annotate(total=Sum("bookstore__price")).values("name","total")

 以上代码的annotate方法给Book表在查询的时候添加一个名为total的字段,该字段的数据来源是模型BookStoreprice字段的综合。values方法是只提取nametotal两个字段的值。

aggregate和annotate的区别

  1. aggregate:返回使用聚合函数后的结果
  2. annotate:会在原模型上怎加一个字段,该字段的值为聚合函数的结果,并且在使用聚合函数的时候会使用当前模型的主键进行分组(group by)。
  1. 使用aggregate:计算的是当前模型所有实例的聚合结果;
  2. 而使用annotate:计算的是每条实例相关联的所有数据的聚合结果。

    如计算Author表中每个作者的文章数。


Last Modified : 2020-03-09 19:34:06