2

カテゴリ モデルとビデオ モデルがあります

Category:
   name=Charfield()

Video:
   name=CharField()
   category=ManyToManyField()
   is_live=BooleanField()

そして、ビデオカウントですべてのカテゴリを取得したいのですが、ライブではないビデオを除外したいと考えています。これは私の開始状態です:

Category.objects.annotate(video_count=Count('video'))

# I tried this but I'm not sure if this the right way
 Category.objects.exclude(video__is_liive=False)

何か案は?

4

1 に答える 1

1

注釈を付けているフィールドをフィルタリングしたい場合は、まだ ORM を介して行うことができないため、生の SQL を使用する必要があります。私はこれについてブログ記事を書きました:

http://timmyomahony.com/blog/filtering-annotations-django/

中間テーブルを使用する M2M 関係があるため、状況はもう少し複雑です。3 つのテーブルすべてを結合し、マークされているテーブルのみをカウントする次のようなものが必要ですis_live=True(これは完全にテストされていないため、いじる必要があります)。

categories = Category.objects.all().extra(select = {
  "video_count" : """
  SELECT COUNT(*)
  FROM myapp_videocategory
    JOIN myapp_videocategory on myapp_videocategory.category_id = myapp_category.id
    JOIN myapp_video on myapp_videocategory.video_id = myapp_video.id
  WHERE myapp_video.is_live = True
  """
}).order_by("-live_video_count",)
于 2013-11-04T11:27:00.813 に答える