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

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

  • 相关阅读:
    占位 CP
    占位 LR
    占位 DL
    占位 SC
    Your name ?
    占位 RK
    Gson 关于SpringMVC和json格式问题
    JDBC
    Outlook2016 2019修改默认存储路径文件夹
    Windows Server 2016 任务管理器没有了远程控制 远程桌面,能够控制其它远程用户的会话
  • 原文地址:https://www.cnblogs.com/zzliu/p/10589390.html
Copyright © 2011-2022 走看看