web-dev-qa-db-fra.com

L'annotation d'une somme aboutit à Aucune plutôt qu'à zéro

Je crée un site d'assurance qualité similaire à la page sur laquelle vous vous trouvez actuellement. J'essaie d'ordonner les réponses en fonction de leur score, mais les réponses qui n'ont pas de vote ont leur score défini sur Aucun plutôt que sur 0. Cela se traduit par des réponses sans vote se trouvant au bas de la page ci-dessous les réponses classées négativement. Comment puis-je faire en sorte que le score annoté soit nul lorsqu'il n'y a pas de vote pour une réponse?

Voici mon modèle:

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)

Et voici ma requête:

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

edit: Et pour être clair, je voudrais le faire dans la requête. Je sais que je pourrais le transformer en liste, puis le trier dans mon code python, mais j'aimerais éviter cela si possible.

49
Jackie

Vous pouvez utiliser la fonction Coalesce de Django.db.models.functions comme:

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