在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论:

结论

  • value在annotate前面时,相当于group by,即models.表名.objects.values('group by 字段').annotate(统计字段)
  • value放在annotate后面时,相当于select
  • annotate前面没有value时,默认按当前表的主键分组

验证

表格准备

查询

value放在前面时

ret=models.Student.objects.values('gender').annotate(count=Count('sid')).order_by('-count')
print(ret)

等价于以下sql语句

SELECT `app_student`.`gender`, COUNT(`app_student`.`sid`) AS `count` FROM `app_student` GROUP BY `app_student`.`gender` ORDER BY `count` DESC

执行结果

<QuerySet [{'gender': '女', 'count': 6}, {'gender': '男', 'count': 5}]>

可以看到结果是按性别分组的

### value放在后面时

ret = models.Student.objects.annotate(count=Count('sid')).values('gender').order_by('-count')
print(ret)

等价于以下sql语句

SELECT `app_student`.`gender` FROM `app_student` GROUP BY `app_student`.`sid` ORDER BY COUNT(`app_student`.`sid`) DESC

执行结果

<QuerySet [{'gender': '女'}, {'gender': '男'}, {'gender': '女'}, {'gender': '女'}, {'gender': '男'}, {'gender': '女'}, {'gender': '男'}, {'gender': '男'}, {'gender': '女'}, {'gender': '女'}, {'gender': '男'}]>

可以看到结果并没有按性别分组,而是每个学生作为一组,说明上述结论是正确的

Django聚合与分组查询中value与annotate的顺序问题的更多相关文章

  1. Django 多表、跨表、聚合、分组查询

    前期准备: 创建表 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalFi ...

  2. Django-ORM之聚合和分组查询、F和Q查询、事务

    聚合查询 聚合对查询的结果进行一步的计算加工. aggregate()是QuerySet 的一个终止子句 ,他的作用是,返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键 ...

  3. django 一个关于分组查询的问题分析

    ret=Emp.objects.values('dep').annotate(avg_salary=Avg('salary')) print(ret) # ---*******单表分组查询ORM总结: ...

  4. 八、django学习之分组查询、F查询和Q查询

    分组查询.F查询和Q查询 分组查询 统计每个出版社出版的书籍的平均价格 第一种方式 obj = models.Book.objects.values('publishs_id').annotate(a ...

  5. Solr.NET快速入门(五)【聚合统计,分组查询】

    聚合统计 属性 说明 Min 最小值 Max 最大值 Sum 总和 Count 记录数,也就是多少行记录 Missing 结果集中,有多少条记录是空值 SumOfSquares 平方和(x1^2 + ...

  6. 聚合与分组查询,F与Q查询

    from django.db.models import Q 查询书籍名称是python入门或者价是555.55的书 book_queryset = models.Book.objects.filte ...

  7. 【Django】Django 如何支持 分组查询、统计?

    代码: from django.db.models import Sum alarm_sum_group_items = models.FILE_PROTECT_ALARM.objects.filte ...

  8. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  9. Django 聚合查询 分组查询 F与Q查询

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

随机推荐

  1. 最小表示法模板(洛谷P1368 工艺)(最小表示法)

    洛谷题目传送门 最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串. 因为是环状的,所以肯定要先转化为序列,把原串倍长. 设决策点为一个表示法的开头.比较两个决策 ...

  2. SDOI2017 Round1 简要题解

    我们 TM 怎么又要上文化课..我 哔哔哔哔哔哔 「SDOI2017」数字表格 题意 有 \(T\) 组数据,求 \[ \prod_{i = 1}^{n} \prod_{j = 1}^{m} fib[ ...

  3. 【CF833D】Red-Black Cobweb(点分治)

    [CF833D]Red-Black Cobweb(点分治) 题面 CF 有一棵树,每条边有一个颜色(黑白)和一个权值,定义一条路径是好的,当且仅当这条路径上所有边的黑白颜色个数a,b满足2min(a, ...

  4. 【NowCoder368E】车站(线段树)

    [NowCoder368E]车站(线段树) 题面 牛客网 题解 链交的结果显然和求解的顺序无关,因此我们可以拿线段树维护区间链的链交结果. 然后怎么求解最远点. 维护链交的时候再记录两个点表示到达链交 ...

  5. [luogu3157][bzoj3295][CQOI2011]动态逆序对【cdq分治+树状数组】

    题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序 ...

  6. C 头文件、宏、编译问题

    @2019-02-15 [小记] > C 头文件的防重复包含是针对同一个源文件而言 原因: #include 头文件就是一段代码的拷贝,头文件中若有类型定义等,重复包含就会造成编译错误,若无类型 ...

  7. module 'sign.views' has no attribute 'search_name'

    百度找到如下链接 http://lovesoo.org/python-script-error-attributeerror-module-object-has-no-attribute-solve- ...

  8. LOJ6089 小Y的背包计数问题(根号优化背包)

    Solutioon 这道题利用根号分治可以把复杂度降到n根号n级别. 我们发现当物品体积大与根号n时,就是一个完全背包,换句话说就是没有了个数限制. 进一步我们发现,这个背包最多只能放根号n个物品. ...

  9. pandas isin

    在已知id索引的情况下,如何获取所需要的行呢?已经不止一次遇到这样的情况,经历过重重筛选,所得到的最终结果是一串满足所有条件的id列表. pandas 的isin 能很好的解决这个问题, import ...

  10. PHP使用自定义key实现对数据加密解密

    // 加密 function encryptStr($str, $key){ $block = mcrypt_get_block_size('des', 'ecb'); $pad = $block - ...