django - 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
哪个对于为每个风险获取正确的组名很重要。
解决方案
推荐阅读
- java - JavaFX:如何检查页面是否可用
- javascript - Three.js:使用鼠标移动(不点击)平移/移动相机?
- regex - 查找所有出现 1-3 次的字符
- optaplanner - Optaplanner 7.9.0 和添加多线程:相同的planningId 异常
- javascript - 使用 PHP 通过电子邮件发送 Javascript 对象
- sql - 为什么 SQL Server 内置 IntelliSense 无法正确找到表名?
- python - Extracting blocks from a text file
- android - XAxis 上 MPAndroidChart ValueFormatter 的奇怪行为
- django - django错误管理表单丢失或被篡改
- c++ - 向量成员已重置且无法访问