13

このクエリについて考えてみましょう。

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

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

4

3 に答える 3

32

はい、可能です。

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

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'))

Django1.7でテスト済み。

于 2015-01-14T13:10:41.383 に答える
3

いいえ、それらを1つのクエリに結合することはできません。

次のブログ投稿を読んで、2つの回避策を見つけることができます。

于 2012-08-27T01:26:19.310 に答える
0

はい、サブクエリを使用して、ドキュメント:https ://docs.djangoproject.com/en/3.0/ref/models/expressions/#subquery-expressions

latest_chapters = Chapter.objects.filter(novel = OuterRef("pk"))\
    .order_by("chapter_order")

novels_with_chapter = Novel.objects.annotate(
    latest_chapter = Subquery(latest_chapters.values("chapter")[:1]))

Django3.0でテスト済み

サブクエリは、小説のselectステートメント内にselectステートメントを作成し、これを注釈として追加します。これは、データベースにアクセスするのは1回だけであることを意味します。

また、これは実際に小説オブジェクトに注釈を付けるため、ルーンの答えよりも好みます。

これがお役に立てば幸いです。私と同じように後で見に来た人は誰でも。

于 2020-06-04T15:35:46.333 に答える