Django ленивый QuerySet и разбиение на страницы
я прочитала здесь что запросы Django ленивы, он не будет оцениваться, пока он не будет фактически напечатан. Я сделал простую пагинацию с Джанго встроенная пагинация. Я не знал, что уже есть такие приложения, как "django-pagination" и "django-endless", которые выполняют эту работу.
в любом случае мне интересно, является ли QuerySet все еще ленивым, когда я, например, делаю это
entries = Entry.objects.filter(...)
paginator = Paginator(entries, 10)
output = paginator.page(page)
return HttpResponse(output)
и эта часть вызывается каждый раз, когда я хочу получить любую страницу I в настоящее время я хочу посмотреть.
Мне нужно знать, так как я не хочу лишней нагрузки на базу данных.
2 ответов
если вы хотите увидеть, где происходят, импорт django.db.connection
и проверить queries
>>> from django.db import connection
>>> from django.core.paginator import Paginator
>>> queryset = Entry.objects.all()
позволяет создать пагинатор и посмотреть, возникают ли какие-либо запросы:
>>> 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)