在django queryset上使用iterator()

gin*_*ime 14 django iterator django-queryset

我最近遇到了一些奇怪的行为,需要检查一下我的理解.

我在模型中使用了一个简单的过滤器,然后迭代结果.

例如

allbooks = Book.objects.filter(author='A.A. Milne')

for book in allbooks:
   do_something(book)
Run Code Online (Sandbox Code Playgroud)

奇怪的是,它只返回了部分书籍清单.

但是,当使用相同的代码并使用iterator()时,这似乎运行良好.

for book in allbooks.iterator():
    do_something(book)
Run Code Online (Sandbox Code Playgroud)

知道为什么??

ps我确实浏览了django文档,但看不到qeuryset如何在其他任何地方缓存...

iterator() 计算QuerySet(通过执行查询)并在结果上返回迭代器.QuerySet通常在内部缓存其结果,以便重复的评估不会导致其他查询; iterator()而是直接读取结果,而不在QuerySet级别进行任何缓存.对于返回大量对象的QuerySet,这通常会带来更好的性能并显着降低内存

请注意,iterator()在已经评估过的QuerySet 上使用将强制它再次进行评估,重复查询.

ale*_*asi 19

奇怪的是,它只返回了部分书籍清单.

这不是查询集必须如何工作.迭代查询集应该为您提供数据库返回的每条记录.调试你的代码.你会发现错误,否则再次调试.

在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)
Run Code Online (Sandbox Code Playgroud)

  • 你是对的。do_something(book)内部的某些内容正在相同的allbook上进行迭代... (2认同)