you variable template tag registered register one not must library ifequal forget expected examples endblock did django django-models django-orm

django - variable - is not a registered tag library. must be one of:



Anotar una suma da como resultado Ninguno en lugar de cero (3)

Estoy haciendo un sitio de control de calidad que es similar a la página en la que se encuentra en este momento. Estoy tratando de ordenar las respuestas por su puntaje, pero las respuestas que no tienen votos tienen su puntaje establecido en Ninguno en lugar de 0. Esto da como resultado respuestas sin votos en la parte inferior de la página debajo de las respuestas clasificadas negativamente. ¿Cómo puedo hacer que la puntuación anotada sea cero cuando no hay votos para una respuesta?

Aquí está mi modelo:

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)

Y aquí está mi consulta:

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

editar: Y para ser claro, me gustaría hacer esto en la consulta. Sé que podría convertirlo en una lista y luego ordenarlo en mi código python, pero me gustaría evitar eso si es posible.


¿Qué tal si usas un Manager personalizado? Por ejemplo:

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()

Entonces, puedes usar:

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


Puede usar la función Coalesce de django.db.models.functions como:

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


Puede utilizar esta solución alternativa, pero no estoy seguro de qué tan compatible es esto con diferentes bases de datos (sin embargo, funciona en sqlite3):

Answer.objects.extra(select={ ''score'': ''IFNULL((SELECT SUM(type) '' + / ''FROM <yourapp>_vote '' + / ''WHERE <yourapp>_vote.answer_id = '' + / ''<yourapp>_answer.id), '' + / ''0)'' }).order_by(''-score'')