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