2012-08-27 2 views
7

は、このクエリを考えてみましょう:djangoでは、関連するオブジェクトを単一のクエリで直接アノテーションする方法はありますか?

query = Novel.objects.< ...some filtering... >.annotate(
    latest_chapter_id=Max("volume__chapter__id") 
) 

実は私はこのクエリの後、私は、注釈付きのIDにより、実際のオブジェクトを選択するには、別のクエリを実行する必要がありますので、その最新Chapterオブジェクトと各Novelに注釈を付けることで必要なもの。 IMOこれは醜いです。それらを1つのクエリに結合する方法はありますか?

+0

チャプターに小説を注釈できますか? –

+0

私は小説ごとに最新の章だけが必要なので私には見えませんが、小説には多くの章があり、章はさまざまな巻にあります。私が知っている限り、「distinct()」はこのケースでは役に立たず(私が間違っていれば正解)、小説から始めることを除いて、ちょうど1つの章を選択する他の方法はわかりません。何か案は? – SAPikachu

答えて

2

いいえ、1つのクエリに組み合わせることはできません。

次のblog postを読んで、2つの回避策を見つけることができます。

+2

ルーン・カアガードの答えが今より良いです。 – qznc

+1

リンクされたポストは、クエリでextra()を使用することを示唆しています。 Django 1.8以降、extra()は推奨されず、推奨されなくなりました。 – johanno

15

はい、可能です。

その小説の最後にあるすべての章を含むクエリセットを取得するには、単に実行します。

Djangoの1.7でテスト
from django.db.models.expressions import F 
from django.db.models.aggregates import Max 

Chapters.objects.annotate(last_chapter_pk=Max('novel__chapter__pk') 
      ).filter(pk=F('last_chapter_pk'))