0

つまり、2 つのモデルがPersonありFilm、それらが多対多の関係にあります。私の目標は、映画を手に入れて、少なくとも 10 本の映画にも出演した人物を出力することです。

たとえば、次の方法で個別にカウントを取得できます。

>>> Person.objects.get(short__istartswith = "Matt Damon").film_set.count()
71

ただし、特定の映画のすべての俳優を除外しようとすると、次のようになります。

>>> Film.objects.get(name__istartswith="Saving Private Ryan").actors.all().annotate(film_count=Count('film')).filter(film_count__gte=10)
[]

film_countマット・デイモン (上記のように) などの俳優が私のデータベースで 71 の映画に出演しているにもかかわらず、手動で全員を見ると 1 であるため、空のセットを返します。

このクエリでわかるように、注釈は機能しません。

>>> Film.objects.get(name__istartswith="Saving Private Ryan").actors.all().annotate(film_count=Count('film'))[0].film_count
1
>>> Film.objects.get(name__istartswith="Saving Private Ryan").actors.all().annotate(film_count=Count('film'))[0].film_set.count()
7

そして、私はそれをフィルタリングする方法を理解できないようですfilm_set.count()

4

1 に答える 1

0

したがって、最も効率的なクエリであるかどうかはわかりませんが、最初にすべての人物に注釈を付けてから、映画と映画の数に基づいてフィルタリングする方法を考えました。

Person.objects.annotate(film_count=Count('film')).filter(film__name__istartswith="Saving Private Ryan").filter(film_count__gte=10)
于 2013-10-29T04:38:27.373 に答える