2013-11-04 31 views
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) 

任何想法?

回答

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",)