5

私はプロジェクトでdjango-threadedcommentsとdjango-votingを使用して、Redditのようなコメント投票システムを実現しています。

すべてを正しく設定し、スレッド化された各コメントとその子の投票を正常に記録できますが、スコアが最も高いコメントが上位に表示されるようにコメントを並べ替える方法に少しこだわっています。 。

テンプレートタグを通過することは解決策でしょうか?私はこれを試みて、アイテムがscore降順で並べられたリストを返しましたが、コメントの親子関係が台無しになりました。これが私がしたことです:

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

これに関するヘルプや提案をいただければ幸いです。ありがとう!

4

1 に答える 1

4

2つの戦略があります:

1)すべてのスレッドの一番上のコメントでのみソートしたい。このコメントには親コメントがないというクエリの制限を追加します(threadedcommentsモデルが正確にどのように設計されているかはわかりません)。

2)順序付けられた結果を取得し、すべてのコメントをそのルートの親にトラバースします。次に、重複を上から下にフィルターで除外します。このように、各スレッドは、スレッド内のコメントの最大スコアに従ってスコアリングされます。これは実装が難しく、率直に言って、私の頭の中で最も直感的な順序のようには思えません。

これを実行すると、テンプレートにスレッド形式で表示するコメントの順序付きリストが作成されます(テンプレートの再帰が行われていると思います)。

于 2010-10-08T15:51:00.760 に答える