首页 > 解决方案 > Django 1.11 注解 GROUP BY 错误

问题描述

像这样的模型关系

Risk <-- RiskGroup --> Group

我正在尝试实现类似于此的查询

SELECT risk.id,
       (
         SELECT array_agg(bg.name) as names
         FROM hazards_riskgroup rgroup
                JOIN (SELECT * FROM base_group ORDER BY name) as bg
                     on rgroup.group_id = bg.id
         WHERE risk_id = risk.id
         GROUP BY risk_id
         ORDER BY risk_id
       ) AS conf
FROM hazards_risk risk
ORDER BY conf NULLS LAST
;

我已经做到了

group_names = (
    RiskGroup.objects
    .filter(risk_id=OuterRef('pk'))
    .annotate(names=ArrayAgg('group__name'))
    .order_by()
    .order_by("group__name")
    .values('names')
)
qs = Risk.objects.annotate(
    conf=Subquery(group_names)
).order_by(F('conf').asc(nulls_last=True))

但这会产生类似于此查询的内容

SELECT risk.id,
       (SELECT ARRAY_AGG(U2."name") AS "names"
        FROM "hazards_riskgroup" U0
               INNER JOIN "base_group" U2 ON (U0."group_id" = U2."id")
        WHERE U0."risk_id" = (risk.id)
        GROUP BY U0."id", U2."name"
        ORDER BY U2."name" ASC) AS "conf"
FROM hazards_risk risk
ORDER BY conf NULLS LAST

请注意,生成的GROUP BY变为GROUP BY U0."id", U2."name",我想要的只是GROUP BY U2."name"

我能收集到的最好的信息是它与模型上的一些默认排序有关,但正如您所知,我已经通过插入.order_by().

所以我有点失落。我尝试使用 Raw sql 进行注释,但在这种情况下,我似乎无法引用risk.id哪个对于为每个风险获取正确的组名很重要。

标签: djangogroup-bysubquery

解决方案


推荐阅读