这是来自关于查询集的 django 文档iterator() method https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.iterator:
QuerySet 通常会在内部缓存其结果,以便重复计算
不会导致额外的查询。相反,iterator() 将读取结果
直接执行,无需在 QuerySet 级别进行任何缓存(在内部,默认迭代器调用 iterator() 并缓存返回值)。对于一个查询集
返回大量您只需要访问一次的对象,
这可以带来更好的性能并显着减少内存。
读完后,我仍然很困惑:关于提高性能和减少内存的行表明我们应该只使用iterator()
方法。有人可以举一些好的和坏的例子吗iterator()
usage?
即使查询结果没有被缓存,如果他们真的想多次访问模型,难道就不能执行以下操作吗?
saved_queries = list(Model.objects.all().iterator())
请注意您喊出的句子的第一部分:For a QuerySet which returns a large number of objects that you only need to access once
因此,相反的是:如果您需要重复使用一组结果,并且它们的数量并没有太多而导致内存问题,那么您不应该使用iterator
。因为额外的数据库往返是always与使用缓存结果相比,会降低性能。
您可以强制将 QuerySet 计算为列表,但是:
- 它需要更多的打字
saved_queries = Model.objects.all()
- 假设您正在网页上对结果进行分页:您将强制将所有结果放入内存(回到可能的内存问题),而不是允许后续分页器选择它需要的 20 个结果的切片
-
QuerySets很懒 https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy,因此您可以拥有一个上下文处理器,例如,它将 QuerySet 放入每个请求的上下文中,但仅当您在某些请求上访问它时才会对其进行评估,但如果您强制评估,则每个请求都会发生数据库命中
典型的 Web 应用程序案例是针对相对较小的结果集(它们必须及时传递到浏览器,因此如果需要,可以采用分页或类似技术来减少数据量),因此通常是标准QuerySet
行为就是你想要的。正如您无疑知道的那样,您必须将查询集存储在变量中 https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets以获得缓存的好处。
迭代器的良好使用:处理占用大量可用内存(大量小对象或较少大对象)的结果。根据我的经验,在进行大量数据处理时,这通常出现在管理命令中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)