Python django查询使用annotate,并为每个注释提供一个过滤器

Python django查询使用annotate,并为每个注释提供一个过滤器,python,django,django-models,django-queryset,django-orm,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

我有以下数据库模型-

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 
但是,这将导致对数据库中存在的每个对象进行两次查询。 另一种方法是使用
注释

obj = ObjectDetail.objects.select_related().filter(FILTER_CONDITION).annotate(upvote=Count('vote'), downvote=Count('Vote')).order_by('-shared_time')
从某种意义上说,上述说法是错误的,因为它只给了我计票结果,而不考虑赞成票和反对票

如果查看模型,可以通过过滤
vote\uuu vote\u type=True
获得upvote,通过
vote\uu vote\u type=False获得downvote

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

因此,我的主要目标是获得每个项目的
upvote
downvote
两个值,进行最少的db查询,这样在模板中,如果我这样做

{{obj.upvote}}我可以得到对象的upvote数,downvote的类似数


请告诉我,谢谢。

您是否尝试使用
values()
对不同的
投票类型进行分组?

此时,您可以在模板中使用
regroup
,循环
ObjectDetails
s


如您所见,我有两件事,
upvote
downvote
因此我需要两个不同的值,基于过滤器。你只提到了一个。据我所知,你想从tbl_name GROUP BY vote_type
中做一些类似于
COUNT(*)的事情,
values()
的目的应该就是这个。我已经编辑了问题,请重新阅读。谢谢你的帮助。我编辑了我的答案,现在,
Vote
s已正确计数,但您不会循环查看
ObjectDetail
s。不幸的是,我看不到任何其他方法可以只通过一个查询获得它们。
Vote.objects.select_related().filter(FILTER_CONDITION).values('shared_object', 'vote_type').annotate(vote_count=Count('vote_type'))