2017-06-16 20 views
4

私はDjango 1.11とPostgreSQL 9.6を使用しています 私のアプリではPersonというモデルがあり、データベースでは、マテリアライズド・ビューです。Django with Postgresql、列はGROUP BY句に現われなければならない、または集約関数で使用する必要があります

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

を実行すると1列のみまたは主キーとしてPERSONIDを設定していないか、それはないでしょう注釈を実行しない]を選択するとそれはpsycopg2.ProgrammingError: column "person.native" must appear in the GROUP BY clause or be used in an aggregate function

を言う

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

エラーが発生します。

私は、クエリのSQLを印刷:

SELECT 
"person"."native", 
"person"."personid", 
COUNT("person"."native") AS "total" 
FROM "person" 
GROUP BY "person"."native", "person"."personid" 

私は何ができますか?

私はテーブルにビューを作成し、プライマリキーとしてpersonidを設定し、問題はありません。

+0

あなたは 'psql'シェル(またはあなたが直接クエリを発行してみましょう他のインターフェイス)にこのクエリをしようとすると、任意のジャンゴやPythonなしで、どうなりますか? –

+0

psqlシェルでは、動作します。だから私は理由を知らない。 – 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

関連する問題