首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django延迟QuerySet和分页

Django延迟QuerySet和分页
EN

Stack Overflow用户
提问于 2012-05-11 17:22:24
回答 2查看 20.1K关注 0票数 25

我在here上读到Django queryset是懒惰的,直到它真正打印出来才会被评估。我已经使用django的内置分页功能进行了简单的分页。我没有意识到已经有像"django-pagination“和"django-endless”这样的应用程序来完成这项工作。

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

代码语言:javascript
复制
entries = Entry.objects.filter(...)
paginator = Paginator(entries, 10)
output = paginator.page(page)
return HttpResponse(output)

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-11 18:07:48

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

代码语言:javascript
复制
>>> from django.db import connection
>>> from django.core.paginator import Paginator
>>> queryset = Entry.objects.all()

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

代码语言:javascript
复制
>>> paginator = Paginator(queryset, 10)
>>> print connection.queries 
[]

还没有。

代码语言:javascript
复制
>>> page = paginator.page(4)
>>> page
<Page 4 of 788>
>>> print connection.queries 
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]

创建页面已经生成了一个查询,用于计算查询集中有多少个条目。条目尚未获取。

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

代码语言:javascript
复制
>>> objects = page.object_list
>>> print connection.queries
[{'time': '0.014', 'sql': 'SELECT COUNT(*) FROM `entry`'}]

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

从对象列表生成HttpResponse

代码语言:javascript
复制
>>> 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'}]

最后,条目已被获取。

票数 52
EN

Stack Overflow用户

发布于 2012-05-11 18:07:27

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

这意味着它将开始在return HttpResponse(output)上进行评估

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10548744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档