我有一个分类模型和视频模型
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)
任何想法?
答案 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",)