Django lazy QuerySet и разбиение на страницы - программирование
Подтвердить что ты не робот

Django lazy QuerySet и разбиение на страницы

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

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

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

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

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

4b9b3361

Ответ 1

Если вы хотите увидеть, где происходят, импортируйте 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 = 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'}]

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

Ответ 2

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

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