我想用ORM:执行此查询
SELECT ARRAY_AGG("wcm_workflows_transition"."name") AS "names"
FROM "wcm_workflows_transition"
GROUP BY "wcm_workflows_transition"."workflow_id"
ORDER BY "wcm_workflows_transition"."name" ASC;
为此,我使用
Transition.objects.values("workflow__id").annotate(names=ArrayAgg("name")).values("names")
但由于一些未知的原因,Django在GROUP BY
子句中添加了"wcm_workflows_transition"."name"
所以上一个Django ORM表达式执行的查询是:
SELECT ARRAY_AGG("wcm_workflows_transition"."name") AS "names"
FROM "wcm_workflows_transition"
GROUP BY "wcm_workflows_transition"."workflow_id", "wcm_workflows_transition"."name"
ORDER BY "wcm_workflows_transition"."name" ASC;
我无法使用aggregate
,因为我想在子查询中使用查询集
以下是的型号(简化版(
class Workflow:
name = models.CharField(_(u'Name'), max_length=100, unique=True, db_index=True)
class Transition(models.Model):
name = models.CharField(_(u'Name'), max_length=100, db_index=True)
workflow = models.ForeignKey(Workflow, verbose_name=_(u'Workflow'), related_name='transitions',
db_index=True, on_delete=models.PROTECT)
class Meta:
ordering = ('name', )
现在我有两个问题:
- 为什么Django ORM将这些字段添加到
GROUP BY
子句中 - 如何使用ORM执行预期查询
我尝试过的:
我认为Django在GROUP BY
中添加了注释中使用的所有字段,所以我更改了聚合字段,但没有更改按字段分组
然后我问自己name
字段是否有任何约束。事实上,它具有db_index=True
约束。所以我用一个不受约束的字段更改了聚集字段,但name
仍在GROUP BY
中
为什么Django ORM将这些字段添加到GROUP BY
子句中
因为添加的字段是默认的ORDER BY
字段
您可以在Transition
型号的Meta
类中看到这一点:ordering = ('name', )
如何使用ORM执行预期的查询
将order_by()
添加到查询中以清除所有默认值。它是这样的:
Transition.objects.order_by().values("workflow__id").annotate(names=ArrayAgg("label")).values("names")