Джанго ленивый 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)