2010-10-06 5 views
5

J'utilise django-threadedcomments et django-voting dans mon projet pour obtenir un système de vote de type Reddit.Django threadedcomments et vote

J'ai tout configuré correctement et je suis capable d'enregistrer avec succès les votes pour chaque commentaire fileté et ses enfants, mais je suis un peu coincé quant à la façon de trier les commentaires de sorte que le commentaire avec le meilleur score monte au sommet.

Est-ce que le passage d'une balise de gabarit serait une solution? J'ai essayé ceci et ai retourné une liste où les articles ont été commandés par score descendant, cependant la relation parent-enfant des commentaires a été foiré. Voici ce que j'ai fait:

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"" 

Toute aide ou suggestion à ce sujet serait grandement appréciée. Merci!

Répondre

4

Il existe deux stratégies:

1) Vous voulez trier uniquement sur le commentaire sur chaque supérieure fil. Ajouter une restriction à la requête que ce commentaire n'a pas de commentaire parent (je ne suis pas sûr comment le modèle threadedcomments est conçu exactement).

2) Vous prenez le résultat ordonné, et traversez chaque commentaire à son parent racine. Ensuite, vous filtrez les doublons du haut vers le bas. De cette façon, chaque thread est noté en fonction du score maximum de tout commentaire dans le fil. C'est plus difficile à mettre en œuvre et, franchement, cela ne semble pas être l'ordre le plus intuitif dans mon esprit. Après avoir fait cela, vous avez une liste ordonnée de commentaires que vous affichez de manière threadée dans le modèle (je suppose que vous avez une certaine récurrence de modèle).

+0

Merci pour la réponse OmerGertel! J'ai finalement réussi à balayer et essayer à nouveau ce problème - je suis allé avec votre première solution suggérée car elle semble avoir le plus de sens pour moi. Une fois que j'ai ajouté un filtre à trier par commentaires avec 'parent = None', j'ai ensuite passé un autre ensemble de requêtes de ses enfants et les ai triés par score. Cela a fonctionné parfaitement, merci pour votre aide! – twampss

+0

@twampss cela vous dérangerait-il de poster votre code mis à jour? – anders

Questions connexes