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

如果要过滤要注释的字段,则需要使用原始 SQL,因为您还不能通过 ORM 完成。我写了一篇关于这个的博客文章:

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 回答