2017-06-16 56 views
4

我使用的是Django 1.11和Postgresql 9.6 在我的应用程序中,有一个名为Person的模型,它有几个字段。在数据库中,这是一个物化视图。Django with Postgresql,列必须出现在GROUP BY子句中或用于聚合函数

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

当执行

persons = Person.objects.values('personid', 'native')\ 
    .annotate(total=Count('native')) 

它说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" 

我能做些什么?

我将视图放入表中并将personid设置为主键,然后没有问题。

+0

当您尝试在'psql'壳(或任何其他的接口,它可以让你直接发出查询)此查询会发生什么,没有任何的Django或Python? –

+0

在psql shell中,它可以工作。所以我不知道为什么。 – imcmy

+0

你能否排除Django发送的数据不是打印到数据库的SQL? –

回答

1

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

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

参考文献: https://github.com/django/django/commit/daf2bd3efe53cbfc1c9fd00222b8315708023792 https://groups.google.com/forum/#!topic/django-developers/lx3ZSq-W9X4 https://groups.google.com/d/msg/django-developers/lx3ZSq-W9X4/yh4I2CsoBwAJ https://code.djangoproject.com/ticket/28107

相关问题