2017-06-16 57 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

相關問題