2012-08-06 10 views
9

に注釈、カウントと個別を使用すると、ここに私のデータベースクエリです:ジャンゴ:クエリセット

results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id') 

次のようにクエリが故障(私はそれを理解):

  • まずフィルタは、現在の添付ファイルでありますそれらは現在のものです。
  • 次に、特定の 'article_id'を持つ添付ファイルの数を数えます。
  • 次に、各添付ファイルにarticle_idが共通する添付ファイルの番号を付ける。
  • 次に、添付ファイルの数に基づいてランク付けします。
  • 次に、distinctを使ってリストを構文解析して、各article_id値に対して1つのAttachmentオブジェクトがあるようにします。

私はこれをPostgreSQLで実行していますので、Django docsによれば、フィールドに基づいてdistinct()を実行しても問題ありません。

あり、私は、クエリを実行し、エラーがありませんが、私は繰り返す、あるいは、次のエラーがDjangoのデバッグによってスローされた結果を印刷しようとすると:

NotImplementedError at /function/ 
annotate() + distinct(fields) not implemented. 

対話プロンプトからより詳細なトレースバックがされます:

File "<console>", line 1, in <module> 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 118, in _result_iter 
    self._fill_cache() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 875, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 291, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 808, in execute_sql 
    sql, params = self.as_sql() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 107, in as_sql 
    "annotate() + distinct(fields) not implemented.") 
NotImplementedError: annotate() + distinct(fields) not implemented. 

誰でもここで何が起こっているのか分かりますか?

+2

はかなりまっすぐ進むようです。 'NotImplementedError'はDjangoの例外です。コードでは、この時点で 'annotate'と' distinct'(フィールドと)を組み合わせることができないことを知らせています。つまり、今は動作しません。彼らは将来どのような問題が起こっても問題なく動くかもしれませんが、今のところあなたは不運です。あなたはいつでも '生の'に頼り、あなたが望むものを何でもすることができます。 –

+0

上記のコード例では、ドット "。"がありません。 order_byとdistinctフィールドの間。 – Mikael

+0

@Chris同じことを達成するための代替クエリ(生のSQLに加えて)に関するアイデアはありますか? – Pat

答えて

5

回避策はvalues('distinct_fieldname')を使用することです。これにより、最終的なSQL文はそのフィールドにGROUP BY(実際には複数のフィールド名を追加できます)を実行するためです。例えば

、あなたはこれを行うだろう与えられた'filename'のために存在するどのように多くの記事を知りたい場合は:

results = Attachments.objects.filter(currency='current').values('filename').annotate(num_attachments=Count('article_id')).order_by("num_attachments")