Django的aggregate究竟是何方妖孽

  • 发布时间:2017年3月21日 16:33
  • 作者:杨仕航
  • 分类标签: Django
  • 阅读(9045)
  • 评论(1)

前面写了一篇博文:Django用annotate实现联合统计查询

annotate看上去和aggregate很像,反正英语盲的人基本很难区分这两个孪生仔。

实际上,annotate和aggregate用法基本一样,只是返回结果不同。

annotate返回一个QuerySet数据查询对象;

aggregate返回一个dict字典。


我们抛开annotate,先研究明白aggregate。举个栗子,假设有如下模型:

#coding:utf-8
from django.db import models

#标签模型
class Tag(models.Model):
    tag_name = models.CharField(max_length=20)
    
#博客模型
class Blog(models.Model):
    caption = models.CharField(max_length=50)
    tags = models.ManyToManyField(Tag, blank=True)
    view_nums = models.IntegerField(default=0)

Blog模型中有个tags多对多字段,表示一篇博文对应多个标签。

view_nums是记录该博文的阅读次数。

(当然,上面的模型结构不是很好。为了方便举例才把模型写成这样)


我可以使用aggregate对Blog模型进行统计,例如得到文章个数、最大阅读数、最小阅读数、平均阅读数等等。

获取文章总数代码如下:

#coding:utf-8
from django.db import models

result = Blog.objects.aggregate(blog_count=models.Count('caption'))
print(result)

将得到如下结果:

{"blog_count": 120}


还可以同时统计多个数据,例如同时统计最大阅读数和最小阅读数:

#coding:utf-8
from django.db import models

result = Blog.objects.aggregate(
             max_view=models.Max('view_nums'),
             min_view=models.Min('view_nums')
         )
print(result)

得到如下结果:

{"max_view": 1120, "min_view": 154}

同样,你还可以使用models的Sum,Avg等统计类对数据集进行统计计算。

但是,你会发现aggregate只能针对单个字段继续统计。

尽管,它也可以向annotate一样反向统计。但也是只能针对一个字段


不过,我们可以结合annotate一起深入统计。

例如,我想统计每种标签的平均博文数。我们要统计该平均数,需要先得知每种标签的博文数有多少。该统计方法可以参考Django用annotate实现联合统计查询一文。

然后,在这个基础上求得平均值即可。

如下代码:

#coding:utf-8
from django.db import models

#统计每种标签的博文数
tags = Tag.objects.annotate(blogs_count=models.Count('blog'))

#计算tags平均值
avg_tags = tags.aggregate(blogs_avg=models.Avg('blogs_count'))
print(avg_tags)

其中,第8行中Avg使用blogs_count字段是第5行用annotate统计得到。最终结果如下:

{"blogs_avg": 21.5}


如果你不怕看不懂代码的话,可以把这两句代码合并成一行。

#coding:utf-8
from django.db import models

avg_tags= Tag.objects.annotate(blogs_count=models.Count('blog')).aggregate(blogs_avg=models.Avg('blogs_count'))
print(avg_tags)


总结,aggregate是一种统计拓展方法。aggregate得到结果是一个字典,而且它只能针对一个字段统计计算。

上一篇:我的网站搭建(第49天) 评论框使用emoji表情

下一篇:我的网站搭建(第48天) OAuth登录自动获取头像

相关专题: Django QuerySet查询   

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空