zoukankan      html  css  js  c++  java
  • Django聚合与分组查询中value与annotate的顺序问题

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

    结论

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

    验证

    表格准备

    img

    查询

    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': '男'}]>
    

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

  • 相关阅读:
    第二十四讲 ASP.NET中开发复合控件
    第二十六讲 使用ASP.NET实现网络通讯
    第二十五讲 ASP.NET中的XML
    【经验】android webview 后退键导致表单再次提交
    【笔记】java 泛型
    【笔记】Collection
    【算法】Tween算法
    【JavaSript】发现一个漏洞
    【研究】加载图片时,同一url,多次request
    【笔记】多态之Override
  • 原文地址:https://www.cnblogs.com/zzliu/p/10589390.html
Copyright © 2011-2022 走看看