我在我的项目中使用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""
对此有任何帮助或建议将不胜感激。谢谢!
答案 0 :(得分:4)
有两种策略:
1)您只想对每个线程的最高评论进行排序。在查询中添加一条限制,该评论没有父评论(我不确定threadcomments模型是如何设计的。)
2)您获取有序结果,并将每个注释遍历到其根父级。然后,您从顶部到底部过滤掉重复项。这样,每个线程根据线程中任何注释的最大分数进行评分。这很难实现,坦率地说,这似乎不是我脑海中最直观的顺序。
完成此操作后,您将在模板中以线程方式显示一个有序的注释列表(我假设您正在进行一些模板递归)。