2010-10-06 11 views
5

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!

Respuesta

4

Hay dos estrategias:

1) que desea ordenar sólo en el comentario más alta en cada hilo. Agregue una restricción a la consulta de que este comentario no tiene ningún comentario principal (no estoy seguro de cómo el modelo de commentos roscados está diseñado exactamente).

2) Usted toma el resultado ordenado, y atraviesa cada comentario a su padre raíz. Luego, filtra los duplicados de arriba a abajo. De esta forma, cada tema se puntúa de acuerdo con la puntuación máxima de cualquier comentario en el hilo. Esto es más difícil de implementar y, francamente, no parece el orden más intuitivo en mi mente.

Después de que haya hecho esto, tiene una lista ordenada de comentarios que muestra de forma enhebrada en la plantilla (supongo que tiene alguna recursión de plantilla).

+0

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

+0

@twampss ¿te importaría publicar tu código actualizado? – anders