Estoy usando django-threadedcomments y django-voting en mi proyecto para lograr un sistema de votación con comentarios de tipo Reddit.Django threadedcomments and voting
He configurado todo correctamente y puedo grabar con éxito los votos para cada comentario con hebra y sus hijos, sin embargo, estoy un poco atascado en cómo ordenar los comentarios para que el comentario con la puntuación más alta se eleva a la cima.
¿Sería una solución pasar una etiqueta de plantilla? Intenté esto y devolví una lista donde los artículos estaban ordenados por score
descendiendo, sin embargo, la relación padre-hijo de los comentarios se dañó. Esto es lo que hice:
class OrderByVotesNode(template.Node):
def __init__(self, queryset_var, direction="desc"):
self.queryset_var = template.Variable(queryset_var)
self.direction = direction
def render(self, context):
key = self.queryset_var.var
value = self.queryset_var.resolve(context)
try:
direction = template.Variable(self.direction).resolve(context)
except template.VariableDoesNotExist:
direction = "desc"
model = value.model
qn = connection.ops.quote_name
ctype = ContentType.objects.get_for_model(model)
by_score = model.objects.filter(id__in=[f.id for f in value]).extra(select={"score": """
SELECT coalesce(SUM(vote), 0)
FROM %s
WHERE content_type_id = %s
AND object_id = %s.%s
""" % (qn(Vote._meta.db_table), ctype.id, qn(model._meta.db_table), qn(model._meta.pk.attname))},
order_by=[(direction == "desc" and "-" or "") + "score"])
context[key] = by_score
return u""
Cualquier ayuda o sugerencias sobre este sería muy apreciada. ¡Gracias!
Gracias por la respuesta OmerGertel! Finalmente pude barrer y volver a intentar con este problema: fui con tu primera solución sugerida, ya que parece tener más sentido para mí. Una vez que agregué un filtro para ordenar por comentarios con 'parent = None', pasé otro conjunto de consultas de sus elementos secundarios y los clasifiqué por puntuación. Esto funcionó perfectamente, gracias por tu ayuda! – twampss
@twampss ¿te importaría publicar tu código actualizado? – anders