25

我在这里读到Django 查询集是惰性的,在实际打印之前不会对其进行评估。我使用 django 的内置分页做了一个简单的分页。我没有意识到已经有诸如“django-pagination”和“django-endless”之类的应用程序可以完成这项工作。

无论如何,当我这样做时,我想知道 QuerySet 是否仍然是懒惰的

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

每次我想获取我当前想要查看的任何页面时都会调用这部分。

我需要知道,因为我不想给数据库带来不必要的负载。

4

2 回答 2

53

如果您想查看发生的位置,请导入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 = 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'}]

最后,条目已被提取。

于 2012-05-11T10:07:48.060 回答
4

这是。Django 的分页使用与查询集相同的规则/优化。

这意味着它将开始评估return HttpResponse(output)

于 2012-05-11T10:07:26.990 回答