我正在使用Python 2.7,Django 1.5。 在models.py中,我有:
class Link(models.Model):
submitter = models.ForeignKey(User)
url = models.URLField("URL", max_length=250, blank=True)
with_votes = LinkVoteCountManager()
def __unicode__(self):
return self.url
class LinkVoteCountManager(models.Manager):
def get_query_set(self):
return super(LinkVoteCountManager, self).get_query_set().annotate(votes=Count('vote')).order_by('-votes')
class Vote(models.Model):
voter = models.ForeignKey(User)
link = models.ForeignKey(Link)
接下来,在views.py中我有:
class LinkListView(ListView):
model = Link
queryset = Link.with_votes.all()
以上正确地给出了每个链接聚合的投票数。现在,将它提升到一个新的水平,我想将downvotes纳入这个设置。我在投票类中添加了value = models.IntegerField(default=0)
属性(以捕获-1和1值),并在我的自定义管理器中将votes=Count('vote')
更改为votes=Count('vote.value')
。
不幸的是,似乎并非自定义管理器的工作方式。我现在难以理解如何在这种设置中以高效,优雅的方式实现upvote / downvote。作为Django新手当然没有帮助。
任何能够阐明他们如何解决这个问题的大师都非常欢迎!
答案 0 :(得分:0)
不,这不是聚合的工作原理:你的问题就在那里,与管理者没有任何关系。
首先,要正确计算正面和负面投票的总和,您需要Sum
,而不是Count
。
要在Django中查询查询中的关系,可以使用双下划线语法,而不是点。所以:
...annotate(votes=Sum('vote__value')).