Django ORM GROUP BY查询时,存在group by自带主键的问题

问题:

在GROUP BY查询时,发现查出的结果不对。

results = TestResult.objects.filter(test_id='54_1')\
        .annotate(security_group_id=F('index_id__security_group_id')) \
        .annotate(dcount=Count('security_group_id')) \
        .values('security_group_id') \
        .order_by('security_group_id')

利用Pycharm的debug平台,导出sql到navicat里测试一下,

Django ORM GROUP BY查询时,存在group by自带主键的问题_第1张图片

发现,在sql语句里带了主键 result_id,但这是我不想要的。应该是:

Django ORM GROUP BY查询时,存在group by自带主键的问题_第2张图片

同样的问题描述,在网站的一个回答中,具有相似情况

Django ORM GROUP BY查询时,存在group by自带主键的问题_第3张图片

解决:

ORM方式的sql语句也有一定的顺序,原有的python代码中,values()等于select后的字段,group by在这里等于count的使用。由于原代码错误的将annotion中的count放在values()前面,结果group by分组时找不到字段,就默认把主键带上。

修改后的代码为:

    results = TestResult.objects.filter(test_id='54_1')\
        .annotate(security_group_id=F('index_id__security_group_id')) \
        .values('security_group_id') \
        .annotate(dcount=Count('security_group_id')) \
        .order_by('security_group_id')

资料:附一个国外博客资料

你可能感兴趣的:(python,SQL,数据库,sql,django,orm,group,by)