django查询为每个注释使用带过滤器的注释

时间:2013-05-08 08:28:10

标签: python django django-models django-queryset django-orm

我有以下数据库模型 -

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')

上述陈述在某种意义上是错误的,它只是给了我投票的数量,无论是票数还是票数。

如果您看到该模型,您可以通过过滤vote__vote_type = True并按vote__vote_type=False

进行下调来获得投票

如何在查询语句中添加这两个条件/过滤器?

所以我的主要目标是为每个项目获取upvotedownvote的两个值,并进行最少的数据库查询,这样在模板中,如果我这样做

{{obj.upvote}}我可以获得对象的upvote数量,以及downvote的类似数量。

请让我知道,谢谢。

1 个答案:

答案 0 :(得分:0)

您是否尝试使用values()对不同的vote_type进行分组? https://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 s

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

相关问题