带有Postgresql的Django列必须出现在GROUP BY子句中,或者用在聚合函数中

imc*_*cmy 7 django postgresql

我正在使用Django 1.11和Postgresql 9.6在我的应用程序中,有一个名为Person的模型,它有几个字段.在数据库中,它是物化视图.

class Person(models.Model):
    personid = models.CharField(max_length=18, primary_key=True)
    count = models.BigIntegerField()
    native = models.CharField(max_length=2)
    ...
Run Code Online (Sandbox Code Playgroud)

执行时

persons = Person.objects.values('personid', 'native')\
    .annotate(total=Count('native'))
Run Code Online (Sandbox Code Playgroud)

它说 psycopg2.ProgrammingError: column "person.native" must appear in the GROUP BY clause or be used in an aggregate function

当只选择一列不将personid设置为主键不执行注释时,它不会出错.

我打印查询sql:

SELECT
"person"."native",
"person"."personid",
COUNT("person"."native") AS "total"
FROM "person"
GROUP BY "person"."native", "person"."personid"
Run Code Online (Sandbox Code Playgroud)

我能做什么?

我将视图设置为表并将personid设置为主键,然后没有问题.

Bob*_*ort 8

这是Django> = 1.8和Django <2.0中的已知错误.它已在Django 2.0中修复.我有同样的问题,并在django-users邮件列表中提出.

发生了什么是Django进行了一些优化,特别是基于PostgreSQL.在PostgreSQL中,您只需要在GROUP BY子句中使用pk列,但这仅适用于表.(如果你这样做,查询运行得更快.)你不能在PostgreSQL的视图中使用PK,这就是为什么它对我们来说是一个问题,因为我们使用的是非托管模型和后端视图.

参考文献: