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)