我最近遇到了一些奇怪的行为,需要检查我的理解。
我在模型中使用一个简单的过滤器,然后迭代结果。
例如
allbooks = Book.objects.filter(author='A.A. Milne')
for book in allbooks:
do_something(book)
奇怪的是,它只返回了部分书籍清单。
但是,当使用相同的代码并使用 iterator()时,这似乎可以很好地工作。
即
for book in allbooks.iterator():
do_something(book)
知道为什么吗?
p.s.我确实浏览了 Django 文档,但看不到如何将查询集缓存在其他任何地方...
iterator()
评估 QuerySet(通过执行查询)并返回结果的迭代器。QuerySet 通常在内部缓存其结果,以便重复评估不会导致其他查询;iterator()
将直接读取结果,而无需在 QuerySet 级别进行任何缓存。对于返回大量对象的 QuerySet,这通常会导致更好的性能和内存的显着减少
请注意,在已评估的 QuerySet 上使用iterator()
将强制它再次评估,重复查询。
奇怪的是,它只返回了部分书籍清单。
这不是 queryset 必须工作的方式。迭代 queryset 应该给你数据库返回的每条记录。调试你的代码。你会发现错误,否则再次调试。
检查 REPL 很容易。运行manage.py shell
:
from app.models import Model
for o in Model.objects.filter(fieldname="foo"): print o
#Let's see DB query
from django.db import connection
print(connection.queries)
QuerySet 通常在内部缓存其结果,以便重复评估不会导致其他查询。相反,iterator()
将直接读取结果,而无需在QuerySet
级别进行任何缓存。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(49条)