擅长:python、mysql、java
<p>注意句子的第一部分:
<code>For a QuerySet which returns a large number of objects that you only need to access once</code></p>
<p>因此,相反的是:如果您需要重用一组结果,而这些结果数量不多,以致于导致内存问题,那么您不应该使用<code>iterator</code>。因为额外的数据库往返总是会降低性能,而不是使用缓存的结果。</p>
<p>您可以强制将QuerySet计算到列表中,但是:</p>
<ul>
<li>它需要更多的输入,而不仅仅是<code>saved_queries = Model.objects.all()</code></li>
<li>假设您正在对网页上的结果进行分页:您将强制将所有结果放入内存(返回到可能的内存问题),而不是允许后续分页器选择它所需的20个结果片段</li>
<li><a href="https://docs.djangoproject.com/en/dev/topics/db/queries/#querysets-are-lazy">^{<cd4>}s are lazy</a>,因此您可以有一个上下文处理器,例如,它将一个QuerySet放入每个请求的上下文中,但只有在您对某些请求进行访问时才会对其求值,但是如果您强制求值,则每个请求都会发生数据库命中</li>
</ul>
<p>典型的web应用程序是针对相对较小的结果集的(它们必须及时交付到浏览器,因此如果需要,可以使用分页或类似的技术来减少数据量),因此通常标准的<code>QuerySet</code>行为就是您想要的。如您所知,您必须<a href="https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets">store the QuerySet in a variable</a>才能从缓存中获益。</p>
<p>迭代器的良好使用:处理占用大量可用内存(大量小对象或更少大对象)的结果。根据我的经验,在处理大量数据时,这通常出现在管理命令中。</p>