Джанго пейджинг с нарезкой - PullRequest
0 голосов
/ 30 ноября 2010

Я новичок в Django и Python и пытаюсь понять, как выполнить подкачку страниц без предварительного получения всех записей из QuerySet.Все примеры, которые я видел с QuerySets, сначала получат все записи, как показано ниже.

tickets = Ticket.objects.filter(site=site.id)    
paginator = Paginator(tickets, settings.PAGE_SIZE)

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

Как мне спроектировать страницу для подкачки, чтобы получить только записи, относящиеся к этой странице (нарезка?), Но при этом все еще иметь функции подкачки?код, который повторяется.

  {% for ticket in tickets.object_list %}
        {{ ticket }}<br/>
   {% endfor %}

1 Ответ

1 голос
/ 30 ноября 2010

Базовые запросы для объектов QuerySet не выполняются, пока вы их явно не оцените. Явная оценка происходит всякий раз, когда вы выполняете их итерацию, включая вызов str() или unicode().

Таким образом, приведенный фрагмент кода действительно эффективен. Строка tickets = Ticket.objects.filter(site=site.id) создает новый QuerySet, но запрос еще не обработан.

По той же причине, например, Model.objects.filter(foo).filter(bar).order_by(baz)... не выполняет ни одного SQL-запроса.

...