为什么Django ORM在GROUP BY子句中添加了一个未指定的字段



我想用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', )

现在我有两个问题:

  1. 为什么Django ORM将这些字段添加到GROUP BY子句中
  2. 如何使用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")

相关内容

  • 没有找到相关文章

最新更新