Django пронизывал комментарии и голосование - PullRequest
5 голосов
/ 06 октября 2010

Я использую django-threadadedcomments и 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 Ответ

4 голосов
/ 08 октября 2010

Есть две стратегии:

1) Вы хотите отсортировать только самые верхние комментарии в каждой теме. Добавьте ограничение на запрос, чтобы у этого комментария не было родительского комментария (я не уверен, как точно разработана модель threadadedcomments).

2) Вы берете упорядоченный результат и пересекаете каждый комментарий к его корневому родителю. Затем вы отфильтровываете дубликаты сверху вниз. Таким образом, каждая ветка оценивается в соответствии с максимальной оценкой любого комментария в ветке. Это сложнее реализовать, и, честно говоря, мне кажется, это не самый интуитивный порядок.

После того, как вы это сделали, у вас есть упорядоченный список комментариев, который вы отображаете в шаблоне в виде цепочки (я предполагаю, что у вас есть какая-то рекурсия шаблона).

...