Простое ранжирование наборов запросов в шаблоне Django - PullRequest
4 голосов
/ 28 января 2011

У меня есть модель в простом приложении django, которая записывает баллы для людей, участвующих в конкурсе. У меня есть два модельных объекта, Entry и Person. Каждая запись имеет человека, а человек имеет несколько записей.

Я хочу создать страницу, которая показывает каждого пользователя, его общий балл и рейтинг.

Команда, которую я получил до сих пор, выглядит следующим образом:

Entry.objects.values('person__name').annotate(total=Sum('score')).order_by('-total')

Я могу вывести результат этого на страницу, используя блок for. Единственное, что я не получаю, это звание.

Как лучше всего добавить к каждой записи числовой ранг записи, включая тот факт, что, когда две оценки совпадают, ранг отражает это (т. Е. «4 =»)? Было бы лучше попытаться сделать это в шаблоне, используя protectlock.counter и некоторый механизм упреждения / отставание, или попытаться вставить это поле в сам запрос?

Ответы [ 3 ]

7 голосов
/ 28 января 2011

Это очень сложно. Я бы фактически сделал всю работу в представлении, изменив там набор запросов и передав его в шаблон.

rank = 1
previous = None
entries = list(entries)
previous = entries[0]
previous.rank = 1
for i, entry in enumerate(entries[1:]):
    if entry.value != previous.value:
        rank = i + 2
        entry.rank = str(rank)
    else:
        entry.rank = "%s=" % rank
        previous.rank = entry.rank
    previous = entry
1 голос
/ 29 января 2011

Проще говоря, используйте шаблон loop.counter или loop.revcounter, в этом случае, я думаю, не связывайтесь с запросом.

0 голосов
/ 28 января 2011

Вы не получите ничего больше, кроме person.name, потому что вы указали это в значениях.Добавьте total и все должно быть в порядке.

Entry.objects.values('person__name', 'total').annotate(total=Sum('score')).order_by('-total')

РЕДАКТИРОВАТЬ:

Другое решение:

Person.objects.values('name').annotate(total=Sum('entries__score')).order_by('-total')
...