Django Threaded评论和投票

Django Threaded评论和投票,django,threaded-comments,django-voting,Django,Threaded Comments,Django Voting,我在我的项目中使用django threadedcomments和django投票来实现一个类似Reddit的评论投票系统 我已经正确地设置了所有内容,并且我能够成功地记录每个线程评论及其子评论的投票,但是我有点纠结于如何对评论进行排序,以便得分最高的评论上升到顶部 传递模板标记是一种解决方案吗?我尝试过这样做,并返回了一个列表,其中项目按score降序排列,但是注释的父子关系被搞乱了。以下是我所做的: class OrderByVotesNode(template.Node): def

我在我的项目中使用django threadedcomments和django投票来实现一个类似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""

如果您对此有任何帮助或建议,我们将不胜感激。谢谢

有两种策略:

1) 您只想对每个线程上最上面的注释进行排序。在查询中添加一个限制,即此注释没有父注释(我不确定threadedcomments模型是如何精确设计的)

2) 获取有序结果,并将每个注释遍历到其根父级。然后,从上到下过滤重复项。这样,每个线程都会根据线程中任何注释的最大分数进行评分。这很难实现,坦率地说,在我看来,这似乎不是最直观的顺序


完成此操作后,将有一个有序的注释列表,以线程方式显示在模板中(我假设您正在进行一些模板递归)。

感谢您的回答!我终于能够四处看看,并再次尝试这个问题——我同意你的第一个建议解决方案,因为它似乎对我来说最有意义。一旦我添加了一个过滤器,用
parent=None
对注释进行排序,然后我传递了另一个查询集的子项,并按分数对它们进行排序。这非常有效,谢谢你的帮助!