Django分组查询annotate可能遇到的坑
Django分组查询annotate可能遇到的坑
Django ORM的分组查询一般是values(或values_list)和annotate联用,values里面声明以什么字段分组,annotate 执行分组,这其中可能会有个坑
model大概长这样
class AdsEvent(models.Model):id = models.CharField(primary_key=True, max_length=32)dstip = models.GenericIPAddressField()attack_type = models.CharField(max_length=20, blank=True, null=True)start_time = models.DateTimeField(blank=True, null=True)end_time = models.DateTimeField(blank=True, null=True)total_in_bits = models.BigIntegerField(blank=True, null=True)total_in_packets = models.BigIntegerField(blank=True, null=True)total_drop_bits = models.BigIntegerField(blank=True, null=True)total_drop_packets = models.BigIntegerField(blank=True, null=True)attack_port = models.BigIntegerField(blank=True, null=True)objects = ScrubbingEnvironmentADSEventManager()class Meta:managed = Falsedb_table = 't_ads_event'ordering = ('-end_time', '-start_time')
功能需求是要返回每种攻击类型的攻击次数,那我就根据攻击类型分组,统计个数
ret = queryset.values("attack_type").annotate(value=Count('id'))
嗯,看似没问题
但是返回的结果根本没聚合
why???
可以把ORM转成sql打印出来看看
print(queryset.values("attack_type").annotate(value=Count('id')).query)
对应的sql:
SELECT "t_ads_event"."attack_type", COUNT("t_ads_event"."id") AS "value"
FROM "t_ads_event"
GROUP BY "t_ads_event"."attack_type", "t_ads_event"."end_time", "t_ads_event"."start_time"
ORDER BY "t_ads_event"."end_time" DESC, "t_ads_event"."start_time" DESC
等等,为啥分组条件里会有开始时间和结束时间???
看下model的meta类,原来ordering被指定成默认时间降序
class Meta:managed = Falsedb_table = 't_ads_event'ordering = ('-end_time', '-start_time')
解决方法:查询时把排序参数改成用来分组的参数
ret = queryset.order_by('attack_type').values("attack_type").annotate(value=Count('id'))
对应的sql:
SELECT "t_ads_event"."attack_type", COUNT("t_ads_event"."id") AS "value" FROM "t_ads_event"
GROUP BY "t_ads_event"."attack_type"
ORDER BY "t_ads_event"."attack_type" ASC
ok了
但还存在个问题,如果我的需求是要按照攻击次数从大到小的顺序返回咋办?
那就加个排序喽
ret = queryset.order_by('attack_type').values("attack_type").annotate(value=Count('id')).order_by('-value')
或者这样
ret = queryset.values("attack_type").annotate(value=Count('id')).order_by('-value')
对应sql都是:
SELECT "t_ads_event"."attack_type", COUNT("t_ads_event"."id") AS "value"
FROM "t_ads_event"
GROUP BY "t_ads_event"."attack_type"
ORDER BY "value" DESC
返回结果:
解决!
结论:如果model的meta类中的ordering有被指定,那在annotate分组查询时要多注意
Django分组查询annotate可能遇到的坑相关推荐
- Django 分组查询与ordering字段 巨坑
样例: class Test(Model):class Meta:db_table = 'test'ordering = ['字段1', '字段2', '字段3'] django里常见的 group ...
- Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)
一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); 一本书只应该由一个出版商出 ...
- Day51python Django 多表操作 聚合查询、分组查询、F查询、Q查询
1聚合查询aggregate aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典,可以自己制定键. 1.# 计算所有图书的平均价格 books = mo ...
- Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化
聚合查询 单独使用时,用aggregate 1.只要是跟数据库相关的模块 基本都在django.db.models里面 如果没有应该在django.db里面 2. 聚合查询通常配合分组使用 from ...
- day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询
day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询 昨日内容复习 自定义过滤器.标签.inclusion_tag 1.首先现在应用目录下创建名字为templatet ...
- Django的mode的分组查询和聚合查询和F查询和Q查询
1.聚合查询 # 聚合函数aggregate,求指定字段的最大值,最小值,平均值,和的值,方法如下from django.db.models import Avgfrom django.db.mode ...
- day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁...
一.多表的创建 from django.db import models# Create your models here. class Author(models.Model):id = model ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
- Django聚合分组查询(F与Q查询|ORM查询优化|常见字段参数)
文章目录 一.正反向查询进阶操作 二.聚合查询 三.分组查询 四.ORM再次添加字段 五.F与Q查询 五.ORM查询优化 六.事务操作 七.模型层常见字段 八.ORM常见字段参数 九.多对多三种创建方 ...
最新文章
- [IOS]UIWebView实现保存页面和读取服务器端json数据
- oracle11g ora 29927,【案例】Oracle内存泄漏 进行10046跟踪分析07445导致数据库宕机
- 微信年末最后一发新功能!对生活很有帮助,必须了解一下!
- 服务器系统版本选择,云服务器选择系统版本
- OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字
- 【JavaScript基础】js中关于声明提前的几个误区
- 树莓派3B+功耗测试、初体验、图形化配置树莓派3B+配置方法。Raspberry Pi 3B+测评...
- ubuntu中linux内核的编译、更换与使用
- 【Linux】一步一步学Linux——tty命令(240)
- ICML2020 | 一行代码就能实现的测试集上分技巧
- linux shell 清空文件,查看文件,写入文件
- micronaut pk spring boot
- Linux文件系统的目录结构详解
- 运行Java应用必须通过main()方法吗?
- 苹果mac专业的图像后期处理软件:Lightroom Classic
- cookie token 了解一下
- c# gerber文件读取_必须收藏的一篇关于:AD18生成gerber文件及用CAM350读取gerber教程...
- Hulu是什么?中国也有了?
- 盘点苹果电脑上那些不错的cpu优化工具
- 小动物立体定位架的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告