Django懒惰的QuerySet和分页

sta*_*orn 20 django lazy-loading django-queryset

在这里读到Django查询集是懒惰的,在实际打印之前不会对其进行评估.我使用django的内置分页进行了简单的分页.我没有意识到已经存在诸如"django-pagination"和"django-endless"这样的应用程序.

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

entries = Entry.objects.filter(...)
paginator = Paginator(entries, 10)
output = paginator.page(page)
return HttpResponse(output)
Run Code Online (Sandbox Code Playgroud)

每当我想要获得我目前想要查看的任何页面时,都会调用此部分.

我需要知道,因为我不想对数据库进行不必要的加载.

Ala*_*air 42

如果要查看发生的位置,请导入django.db.connection并检查queries

>>> from django.db import connection
>>> from django.core.paginator import Paginator
>>> queryset = Entry.objects.all()
Run Code Online (Sandbox Code Playgroud)

让我们创建分页器,看看是否有任何查询:

>>> paginator = Paginator(queryset, 10)
>>> print connection.queries 
[]
Run Code Online (Sandbox Code Playgroud)

还没有.

>>> page = paginator.page(4)
>>> page
<Page 4 of 788>
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]
Run Code Online (Sandbox Code Playgroud)

创建页面已生成一个查询,以计算查询集中的条目数.尚未提取条目.

将页面的对象分配给变量'objects':

>>> objects = page.object_list
>>> print connection.queries
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]
Run Code Online (Sandbox Code Playgroud)

这仍然没有导致获取条目.

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'}]
Run Code Online (Sandbox Code Playgroud)

最后,已经获取了条目.

  • 真棒.我不知道django有工具来检查是否有查询. (3认同)
  • @starcorn看看[django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar) (3认同)