我有以下数据库模型 -
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
如何在查询语句中添加这两个条件/过滤器?
所以我的主要目标是获取每个项目的 和 的两个值,upvote
并downvote
进行最少的数据库查询,这样在模板中,如果我这样做
{{ obj.upvote }} 我可以获得对象的赞成票数,以及类似的反对票。
请让我知道,谢谢。