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.
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')