只计算已发布的视频

时间:2013-11-04 11:10:58

标签: django

我有一个分类模型和视频模型

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)

任何想法?

1 个答案:

答案 0 :(得分: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",)