2010-10-06 70 views
5

我在我的項目中使用django-threadedcomments和django-voting來實現類似Reddit的評論投票系統。Django threadedcomments and voting

我已經正確設置了一切,並且能夠成功記錄每個線程評論及其子項的投票,但是我對於如何對評論進行排序以至於評分最高上升到頂部。

會傳遞模板標籤是一個解決方案嗎?我試過這個,並返回了一個列表,其中的項目按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)要排序僅在每個線程上最上面的評論。在查詢中添加對此評論沒有父註釋的限制(我不確定threadcomments模型是如何精確設計的)。

2)您獲取有序結果,並遍歷每個評論到其根父。然後,你從上到下過濾掉重複的內容。這樣,每個線程根據線程中任何評論的最高分數來評分。這很難實現,坦率地說,似乎並不是我腦海中最直觀的順序。

完成此操作後,您將獲得一個有序的註釋列表,您可以在模板中以線程方式顯示註釋(我假設您有一些模板遞歸正在進行)。

+0

感謝您的回答OmerGertel!我終於可以掃一掃,再次嘗試這個問題 - 我採用了你的第一個建議的解決方案,因爲它似乎對我最有意義。一旦我添加了一個過濾器,按照「parent = None」的註釋進行排序,然後我傳遞了另一個子組的查詢集並按分數排序。這工作完美,感謝您的幫助! – twampss 2010-11-13 20:48:07

+0

@twampss你會介意發佈你的更新代碼嗎? – anders 2011-06-09 10:51:51

相關問題