2013-05-08 76 views
0

我有以下的數據庫模型 -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 = Truevote__vote_type=False

如何在查詢語句添加這兩個條件/過濾器downvote得到給予好評?

所以,我的首要目標是得到upvotedownvote兩個值的每個項目,以作最少的數據庫查詢,這樣在模板中,如果我這樣做

{{obj.upvote}}我可以獲得對象的upvote數量,以及downvote的類似數量。

請讓我知道,謝謝。

回答

0

您是否嘗試使用values()來區分不同的vote_typehttps://docs.djangoproject.com/en/dev/topics/db/aggregation/#values

Vote.objects.select_related().filter(FILTER_CONDITION).values('shared_object', 'vote_type').annotate(vote_count=Count('vote_type')) 

在這一點上,你可以在模板中使用循環對regroup小號ObjectDetails

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#regroup

+0

你可以看到,我有兩件事情,'upvote'和'downvote'等等我需要兩個不同的值,基於過濾器。你只提到過一個。 – user1629366 2013-05-08 10:30:47

+0

從我的理解你想要做'COUNT(*)FROM tbl_name GROUP BY vote_type'和'values()'的目的應該就是這個。 – 2013-05-08 10:40:29

+0

我編輯過這個問題,請重新閱讀,謝謝,請幫助。 – user1629366 2013-05-08 10:52:03