Django ORM分组异常:期望按row_2分组却按主键分组求助
问题解决:Django ORM按指定字段分组实现GROUP_CONCAT
数据库表结构及数据
| row_1(PK) | row_2 | row_3 |
|---|---|---|
| 1 | row | one |
| 2 | row | two |
| 3 | row | three |
目标原生MySQL查询
SELECT GROUP_CONCAT(row_3) FROM table_ WHERE row_2 = 'row' GROUP BY row_2;
原ORM代码问题
原代码先执行annotate再调用values,Django会默认按模型主键(row_1)分组,不符合需求:
table_.objects.filter( row_2='row' ).annotate( val=GroupConcat('row_3', '') ).values('val')
修正后的ORM代码
调整调用顺序,先通过values('row_2')指定分组字段,再执行聚合操作,最后提取结果:
table_.objects.filter( row_2='row' ).values('row_2').annotate( val=GroupConcat('row_3', '') ).values('val')
逻辑说明
values('row_2')明确告诉Django要按row_2字段分组,覆盖了默认的主键分组行为。annotate基于指定分组完成GROUP_CONCAT聚合计算。- 最后
values('val')仅提取聚合后的结果,与目标原生SQL逻辑完全匹配。
内容的提问来源于stack exchange,提问作者sarath kumar sontam
相关产品推荐
相关产品推荐

