在汇总 up/down 票并显示有序列表时被模型经理的错误行为难住了

Stumped by model manager's errant behavior when summing up/down votes and displaying an ordered list

这个可能有点棘手。

我有一个基本的网络应用程序,其中用户 post 有趣 URL,而 upvote/downvote best/worst 用户。我正在使用 Python 2.7,Django 1.5。问题陈述在最后以粗体显示。

models.py中,我有以下几行(特别注意标有x[=40=的行]):

class Link(models.Model):
    submitter = models.ForeignKey(User)
    url = models.URLField("URL", max_length=250, blank=True)
x   with_votes = LinkVoteCountManager()

    def __unicode__(self):
        return self.url

class LinkVoteCountManager(models.Manager):
    def get_query_set(self): 
x       return super(LinkVoteCountManager, self).get_query_set().annotate(votes=Sum('vote__value')).order_by('-votes')

class Vote(models.Model):
    voter = models.ForeignKey(User) 
    link = models.ForeignKey(Link) 
x   value = models.IntegerField(default=0)

下一个 views.py 我有:

class LinkListView(ListView):
    model = Link
x   queryset = Link.with_votes.all()

此设置执行以下操作:每当 URL 被提交或投票时,LinkVoteCountManager() 将其 up/down 票和 returns 总计排序的查询集相加.

现在,对于新提交的 link,LinkVoteCountManager() 的投票总和应为 0,因为 Vote 中的 value 被设置为 0(默认情况下)。 但是,我得到 NONE 新鲜提交的 link 票数,这完全打乱了选票的排序方式。 为什么 LinkVoteCountManager 对新的 links 表现不正确(但在 第一次投票后工作正常)。我该如何解决?请指教

新创建的链接可能没有 Vote 个对象。在这种情况下,带注释的 votes 属性将为 None。我现在不知道解决此问题的直接方法,但我想您可以使用 F expressions.

来解决此问题

正如 Rene 的回答中所指出的,Vote 对象不存在,这导致投票计数的值为 None。这当然是合乎逻辑的。我不会推翻这个逻辑,而是会重新设计我的排名算法以确保 "None" 票被计为“0”。