2015-12-15 64 views
0

我想提出一個實體 - 審查 - 投票樣的系統,其中每個單位都會有一些評論,並且每次審查都會有一些票(上/下)減少查詢集的數量Django項目

class Entity(models.Model): 
    name = models.CharField() 
    ... 

class Review(models.Model): 
    author = models.ForeignKey(user) 
    entity = models.ForeignKey(Entity) 
    .... 

class Vote(models.Model): 
    vote_user = models.ForeignKey(user) 
    vote_review = models.ForeignKey(Review) 
    vote_value = models.BooleanField() # True = Up 

對於每個實體,我希望有一個評論列表,每個評論都有多個upvotes和downvotes註釋。

到目前爲止,我的做法是運行每個評論2個額外的查詢:

count_up = Vote.objects.filter(vote_review__id = X, vote_value = True) 
count_down = Vote.objects.filter(vote_review__id = X, vote_value = False) 

這將返回正確的結果。但是,查詢的數量似乎相當低效。

我可以知道是否有更好的方法來構建查詢?或者如何改變模式以更好地支持這種操作?

感謝

+0

你需要整個投票對象還是隻需要計數? – Sayse

+0

只需要計數 – nkt

+0

您可以顯示剩餘的視圖嗎?這些查詢是否在所有評論的循環中完成?如果是這樣,你可以使用註釋。 –

回答

1

如果你想要的是計數,那麼你應該只使用count

返回表示匹配查詢集的數據庫對象的數量的整數。 count()方法從不引發異常。

count_up = Vote.objects.filter(vote_review__id = X, vote_value = True).Count() 
count_down = Vote.objects.filter(vote_review__id = X, vote_value = False).Count() 

這將修改查詢只返回查詢創建和花費時間返回車型停止它的對象的數量。