Джанго ленивый QuerySet и нумерация страниц

Я прочитал здесь, что наборы запросов Django ленивы, они не будут оцениваться, пока не будут напечатаны. Я сделал простую нумерацию страниц, используя встроенную нумерацию в django. Я не осознавал, что уже есть такие приложения, как "django-pagination" и "django-endless", для которых это нужно.

В любом случае, мне интересно, по-прежнему ли QuerySet ленив, когда я, например, делаю это?

entries = Entry.objects.filter(...)
paginator = Paginator(entries, 10)
output = paginator.page(page)
return HttpResponse(output)

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

Мне нужно знать, так как я не хочу ненужной загрузки в базу данных.

2 ответа

Решение

Если вы хотите увидеть, где происходят, импортируйте django.db.connection и проверять queries

>>> from django.db import connection
>>> from django.core.paginator import Paginator
>>> queryset = Entry.objects.all()

Давайте создадим paginator и посмотрим, возникнут ли какие-либо запросы:

>>> paginator = Paginator(queryset, 10)
>>> print connection.queries 
[]

Пока нет.

>>> page = paginator.page(4)
>>> page
<Page 4 of 788>
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]

Создание страницы произвело один запрос, чтобы подсчитать, сколько записей в наборе запросов. Записи еще не получены.

Присвойте объекты страницы переменной "objects":

>>> objects = page.object_list
>>> print connection.queries
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]

Это до сих пор не привело к получению записей.

Генерировать HttpResponse из списка объектов

>>> response = HttpResponse(page.object_list)
>>> print connection.queries
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}, {'time': '0.011', 'sql': 'SELECT `entry`.`id`, <snip> FROM `entry` LIMIT 10 OFFSET 30'}]

Наконец, записи были получены.

Это. Пагинация в Django использует те же правила / оптимизации, которые применяются к наборам запросов.

Это означает, что он начнет оценивать return HttpResponse(output)

Другие вопросы по тегам