我读到here Django查询集是懒惰的,在实际打印之前不会对其进行评估。我使用django的内置分页进行了简单的分页。我没有意识到已经存在诸如“django-pagination”和“django-endless”之类的应用程序,它可以完成这项工作。
无论如何,我想知道当我执行此操作时,QuerySet是否仍然是懒惰的
entries = Entry.objects.filter(...)
paginator = Paginator(entries, 10)
output = paginator.page(page)
return HttpResponse(output)
每当我想要获得我想要查看的任何页面时,都会调用此部分。
我需要知道,因为我不希望对数据库造成不必要的负担。
答案 0 :(得分:41)
如果您想查看发生的位置,请导入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'}]
最后,条目已被提取。
答案 1 :(得分:3)
是的。 Django的分页使用适用于查询集的相同规则/优化。
这意味着它将开始在return HttpResponse(output)