如何在Django/Python中通过超越模型管理器实现upvote/downvote

如何在Django/Python中通过超越模型管理器实现upvote/downvote,python,django,Python,Django,我使用的是Python2.7和Django1.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): retur

我使用的是Python2.7和Django1.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()
上面正确地给出了每个链接聚合的投票数。现在,把它带到下一个层次,我想把反对票也纳入这个设置中。我在投票类中包含了一个
value=models.IntegerField(默认值=0)
属性(用于捕获-1和1个值),并在我的自定义管理器中将
voces=Count('Vote')
更改为
voces=Count('Vote.value')

不幸的是,定制管理器似乎不是这样工作的。我现在很难理解如何在这种设置中以高效、优雅的方式实现upvote/downvote。作为一个Django新手当然没有帮助

任何能够阐明他们将如何解决这个问题的大师都是非常受欢迎的

不,这不是聚合的工作方式:你的问题就在那里,与管理者毫无关系

首先,要正确计算赞成票和反对票的总和,您需要
sum
,而不是
Count

要在Django中遍历查询中的关系,可以使用双下划线语法,而不是点。因此:

...annotate(votes=Sum('vote__value')).

谢谢你的支持,丹尼尔。我开始写这本书是为了更清楚地理解语法和用法:顺便说一句,这个问题还没有完全解决。回想一下,我在投票类中设置了
value=models.IntegerField(默认值=0)
。现在,一旦我在模型管理器中
返回super(LinkVoteCountManager,self)。get\u query\u set()。annotate(投票=Sum('vote\u value'))。order\u by('-vots')
我应该为每个新创建的链接的投票值获取'0',对吗?相反,我得到的是“没有”。似乎
value=models中的
default=0