我有以下的數據庫模型 -Django的查詢使用標註有過濾器對每個註釋
class ObjectDetail(models.Model):
title = models.CharField()
img = models.ImageField()
description = models.TextField()
uploaded_by = models.ForeignKey(User, related_name='uploaded_by')
class Vote(models.Model):
vote_type = models.BooleanField(default = False)
voted_by = models.ForeignKey(User, related_name='voted_by')
voted_for = models.ForeignKey(User, related_name='voted_for')
shared_object = models.ForeignKey(ObjectDetail, null=True, blank=True)
dtobject = models.DateTimeField(auto_now_add=True)
現在,在我的觀點我想upvotes和downvotes的數量爲每個對象。這樣做的
一種方法是下類ObjectDetails 如下增加一個功能 -
@property
def upvote(self):
upvote = Vote.objects.filter(shared_object__id = self.id,
vote_type = True).count()
return upvote
@property
def downvote(self):
downvote = Vote.objects.filter(shared_object__id = self.id,
vote_type = False).count()
return downvote
但這樣做,導致兩個查詢每個對象的,存在於數據庫中。 另一種方法是使用annotate
obj = ObjectDetail.objects.select_related().filter(FILTER_CONDITION).annotate(upvote=Count('vote'), downvote=Count('Vote')).order_by('-shared_time')
上述說法是錯誤的在某種意義上說,它只是給我投票的計數,無論upvotes和downvotes。
如果你看到到模型中,你可以通過過濾vote__vote_type = True
和vote__vote_type=False
如何在查詢語句添加這兩個條件/過濾器downvote得到給予好評?
所以,我的首要目標是得到upvote
和downvote
兩個值的每個項目,以作最少的數據庫查詢,這樣在模板中,如果我這樣做
{{obj.upvote}}我可以獲得對象的upvote數量,以及downvote的類似數量。
請讓我知道,謝謝。
你可以看到,我有兩件事情,'upvote'和'downvote'等等我需要兩個不同的值,基於過濾器。你只提到過一個。 – user1629366 2013-05-08 10:30:47
從我的理解你想要做'COUNT(*)FROM tbl_name GROUP BY vote_type'和'values()'的目的應該就是這個。 – 2013-05-08 10:40:29
我編輯過這個問題,請重新閱讀,謝謝,請幫助。 – user1629366 2013-05-08 10:52:03