I\'m making a QA site that is similar to the page you\'re on right now. I\'m attempting to order answers by their score, but answers which have no votes are having their score
You can use the Coalesce function from django.db.models.functions
like:
answers = (Answer.objects
.filter(<something here>)
.annotate(score=Coalesce(Sum('vote__type'), 0))
.order_by('-score'))
What about you use custom Manager
? For example:
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')