关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
前面写了一篇博文: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得到结果是一个字典,而且它只能针对一个字段统计计算。
下一篇:我的网站搭建(第48天) OAuth登录自动获取头像
相关专题: Django QuerySet查询