0

我有以下数据库模型 -

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)

现在,在我看来,我想获得每个对象的赞成票和反对票的数量。

一种方法是在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 }} 我可以获得对象的赞成票数,以及类似的反对票。

请让我知道,谢谢。

4

1 回答 1

0

您是否尝试values()对不同vote_type的 s 进行分组? 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在模板中使用循环上ObjectDetailss

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

于 2013-05-08T10:23:31.360 回答