С такими модельными отношениями
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"
.
Best I 'Я смог понять, связано ли это с определенным порядком по умолчанию для моделей, но, как вы можете сказать, я уже учел это, вставив .order_by()
.
Так что я немного растерялся,Вместо этого я попытался аннотировать с помощью Raw sql, но в этом случае я не могу ссылаться на risk.id
, что важно для получения правильных названий групп для каждого риска.