gpt4 book ai didi

python - 在 django ORM 中何时使用或不使用 iterator()

转载 作者:IT老高 更新时间:2023-10-28 21:01:12 36 4
gpt4 key购买 nike

这是来自 django docs on the queryset iterator() method :

A QuerySet typically caches its results internally so that repeated evaluations do not result in additional queries. In contrast, iterator() will read results directly, without doing any caching at the QuerySet level (internally, the default iterator calls iterator() and caches the return value). For a QuerySet which returns a large number of objects that you only need to access once, this can results in better performance and a significant reduction in memory.

阅读后,我仍然感到困惑:关于提高性能和减少内存的那一行表明我们应该只使用 iterator() 方法。有人可以举一些 iterator() 用法的好坏例子吗?

即使查询结果没有被缓存,如果他们真的想多次访问模型,难道不能做到以下几点吗?

saved_queries = list(Model.objects.all().iterator())

最佳答案

请注意您调用的句子的第一部分:对于返回大量对象的查询集,您只需要访问一次

所以反过来说:如果你需要重用一组结果,而且它们的数量不会太多而导致内存问题,那么你不应该使用 iterator。因为与使用缓存结果相比,额外的数据库往返总是会降低您的性能。

您可以强制将您的 QuerySet 评估为一个列表,但是:

  • 它需要更多的输入,而不仅仅是 saved_queries = Model.objects.all()
  • 假设您正在对网页上的结果进行分页:您将强制所有结果进入内存(回到可能的内存问题),而不是让后续分页器选择它需要的 20 个结果片段
  • QuerySets are lazy ,因此您可以拥有一个上下文处理器,例如,它将 QuerySet 放入每个请求的上下文中,但仅在您在某些请求上访问它时才被评估,但如果您强制评估数据库命中发生在每个请求中

典型的网络应用案例是针对相对较小的结果集(它们必须及时传递到浏览器,因此如果需要,可以使用分页或类似技术来减少数据量),因此通常标准 QuerySet 行为是你想要的。毫无疑问,您必须 store the QuerySet in a variable以获得缓存的好处。

善用迭代器:处理占用大量可用内存的结果(很多小对象或较少的大对象)。根据我的经验,这通常是在进行大量数据处理时的管理命令中。

关于python - 在 django ORM 中何时使用或不使用 iterator(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12681653/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com