对求和进行注释的结果为“无”而不是“零”

我在做一个质量保证网站,和你现在的页面很相似。我试图按照他们的得分排序答案,但是没有得分的答案的得分被设置为无而不是0。这样的结果是没有投票的答案在下面的页面底部的负面排名的答案。如果没有投票选出答案,我怎样才能使带注释的得分为零?

这是我的模型:

from django.contrib.auth.models import User


Answer(models.Model):
//some fields here
pass


VOTE_CHOICES = ((-1, Down), (1, Up))


Vote(models.Model):
user = models.ForeignKey(User)
answer = models.ForeignKey(Answer)
type = models.IntegerField(choices = VOTE_CHOICES)


class Meta:
unique_together = (user, answer)

And here's my query:

answers = Answer.objects.filter(<something here>)
.annotate(score=Sum('vote__type'))
.order_by('-score')

编辑: 为了清楚起见,我想在查询中这样做。我知道我可以把它变成一个列表,然后在我的 Python 代码中对它进行排序,但是如果可能的话,我想避免这样做。

34492 次浏览

使用定制的 Manager怎么样? 例如:

AnswerManager(models.Manager):
def all_with_score(self):
qs = self.get_query_set().annotate(score=Sum('vote__type'))
# Here, you can do stuff with QuerySet, for example
# iterate over all Answers and set 'score' to zero if None.


Answer(models.Model):
//some fields here
objects = AnswerManager()

Then, you can use:

>>> answers = Answer.objects.all_with_score().order_by('-score')

你可以像下面这样使用 django.db.models.functions中的 Coalesce功能:

answers = (Answer.objects
.filter(<something here>)
.annotate(score=Coalesce(Sum('vote__type'), 0))
.order_by('-score'))