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