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可能遇到的坑相关推荐

  1. Django 分组查询与ordering字段 巨坑

    样例: class Test(Model):class Meta:db_table = 'test'ordering = ['字段1', '字段2', '字段3'] django里常见的 group ...

  2. Django 【第六篇】ORM跨表操作(聚合查询,分组查询,F和Q查询等)

    一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出 ...

  3. Day51python Django 多表操作 聚合查询、分组查询、F查询、Q查询

    1聚合查询aggregate aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典,可以自己制定键. 1.# 计算所有图书的平均价格 books = mo ...

  4. Django08-1:模型层(ORM)--聚合查询/分组查询/F与Q查询/开启事务/常用字段及参数/自定义字段/数据库查询优化

    聚合查询 单独使用时,用aggregate 1.只要是跟数据库相关的模块 基本都在django.db.models里面 如果没有应该在django.db里面 2. 聚合查询通常配合分组使用 from ...

  5. day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询

    day08 外键字段的增删改查 正向反向插叙概念 跨表查询 聚合查询与分组查询 F查询 昨日内容复习 自定义过滤器.标签.inclusion_tag 1.首先现在应用目录下创建名字为templatet ...

  6. Django的mode的分组查询和聚合查询和F查询和Q查询

    1.聚合查询 # 聚合函数aggregate,求指定字段的最大值,最小值,平均值,和的值,方法如下from django.db.models import Avgfrom django.db.mode ...

  7. day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁...

    一.多表的创建 from django.db import models# Create your models here. class Author(models.Model):id = model ...

  8. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数

    一.聚合函数     from django.db.models import Avg,Sum,Max,Min,Count,F,Q   #导入     # .查询图书的总价,平均价,最大价,最小价   ...

  9. Django聚合分组查询(F与Q查询|ORM查询优化|常见字段参数)

    文章目录 一.正反向查询进阶操作 二.聚合查询 三.分组查询 四.ORM再次添加字段 五.F与Q查询 五.ORM查询优化 六.事务操作 七.模型层常见字段 八.ORM常见字段参数 九.多对多三种创建方 ...

最新文章

  1. [IOS]UIWebView实现保存页面和读取服务器端json数据
  2. oracle11g ora 29927,【案例】Oracle内存泄漏 进行10046跟踪分析07445导致数据库宕机
  3. 微信年末最后一发新功能!对生活很有帮助,必须了解一下!
  4. 服务器系统版本选择,云服务器选择系统版本
  5. OpenCV在图像上画线、矩形、椭圆、多边形、填充的多边形、圆、显示文字
  6. 【JavaScript基础】js中关于声明提前的几个误区
  7. 树莓派3B+功耗测试、初体验、图形化配置树莓派3B+配置方法。Raspberry Pi 3B+测评...
  8. ubuntu中linux内核的编译、更换与使用
  9. 【Linux】一步一步学Linux——tty命令(240)
  10. ICML2020 | 一行代码就能实现的测试集上分技巧
  11. linux shell 清空文件,查看文件,写入文件
  12. micronaut pk spring boot
  13. Linux文件系统的目录结构详解
  14. 运行Java应用必须通过main()方法吗?
  15. 苹果mac专业的图像后期处理软件:Lightroom Classic
  16. cookie token 了解一下
  17. c# gerber文件读取_必须收藏的一篇关于:AD18生成gerber文件及用CAM350读取gerber教程...
  18. Hulu是什么?中国也有了?
  19. 盘点苹果电脑上那些不错的cpu优化工具
  20. 小动物立体定位架的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. 9. TCP拥塞控制
  2. 苹果芯片订单立功 台积电股价创新高
  3. win10系统如何把U盘刷成FAT格式?
  4. “工资倒挂”成常态,你介意新员工比你工资高吗?
  5. html去除图片链接边框及其链接虚线
  6. 图片放大不模糊,如何实现?
  7. 宝宝终于退烧了,高兴
  8. php artisan passport,Laravel Passport
  9. 导图解房(01)黄金圈法则解读 买房这件事儿
  10. 养成不断学习的好习惯_如何使用“小习惯”养成一致的学习习惯。