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

18

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

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

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

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

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

Ваш Ответ

2   ответа
3

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

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

39

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

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

Error: User Rate Limit Exceeded starcorn
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdjango-debug-toolbar

Похожие вопросы