2012-05-11 161 views
16

我读here Django查询集是懒惰的,它不会被评估,直到它实际上打印。我用django的内置分页做了一个简单的分页。我没有意识到已经有应用程序,例如“django-pagination”和“django-endless”,它们可以完成这项工作。Django懒惰QuerySet和分页

反正我不知道查询集是否仍然懒惰,当我举例来说做到这一点

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

而这部分被称为我想任何网页我现在我要查看每一次。

我需要知道,因为我不想对数据库造成不必要的负载。

回答

32

如果你想看到那里正在发生,导入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'}] 

最后,这些项目已被取出。

+3

太棒了。我不知道django有检查是否有查询的工​​具。 – starcorn

+3

@starcorn查看[django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar) – DrTyrsa

+0

调试工具栏是每个Django开发人员都应该使用的工具,它是令人难以置信的方便。 – rectangletangle

3

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

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