如何通过在Django / Python中覆盖模型管理器来实现upvote / downvote

时间:2015-05-28 12:00:50

标签: python django

我正在使用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新手当然没有帮助。

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

1 个答案:

答案 0 :(得分:0)

不,这不是聚合的工作原理:你的问题就在那里,与管理者没有任何关系。

首先,要正确计算正面和负面投票的总和,您需要Sum,而不是Count

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

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