Django ORM 使用 Start Limit 限制 QuerySet
Django ORM Limit QuerySet By Using Start Limit
我最近正在构建一个 Django 项目,它处理结果集
2 万行。
所有这些数据都是作为 JSON 的响应,正在对其进行解析以在模板中使用。
目前,我正在使用来自 django ORM 的 objects.all()。
我想知道,我们是否可以分部分获得完整的结果集。
假设,如果结果是 10k 行,则每行拆分为 2K 行。
我的方法是延迟加载数据,使用一次递增 2k 的限制变量。
想知道这种方法是否可行或对这方面有帮助吗?
是的,您可以使用 .iterator(…)
[Django-doc]。正如文档所说:
for obj in MyModel.objects.all()<b>.iterator(chunk_size=2000)</b>:
# … do something with obj
pass
在这种情况下,这将获取 2'000 块的记录。如果您将限制设置得更高,它会在每个查询中获取更多记录,但是您需要更多内存来存储特定时刻的所有这些记录。将 chunk_size
设置得较低会减少内存使用量,但会增加对数据库的查询。
不过,您可能对 pagination [Django-doc] 感兴趣。在这种情况下,请求包含 页码 ,而您 return 只有有限数量的记录。这通常更好,因为并非所有客户端本身都需要 all 数据,而且客户端通常需要能够自己处理数据,如果块太大,客户端也可能被淹没。
我最近正在构建一个 Django 项目,它处理结果集 2 万行。
所有这些数据都是作为 JSON 的响应,正在对其进行解析以在模板中使用。
目前,我正在使用来自 django ORM 的 objects.all()。
我想知道,我们是否可以分部分获得完整的结果集。 假设,如果结果是 10k 行,则每行拆分为 2K 行。
我的方法是延迟加载数据,使用一次递增 2k 的限制变量。
想知道这种方法是否可行或对这方面有帮助吗?
是的,您可以使用 .iterator(…)
[Django-doc]。正如文档所说:
for obj in MyModel.objects.all()<b>.iterator(chunk_size=2000)</b>:
# … do something with obj
pass
在这种情况下,这将获取 2'000 块的记录。如果您将限制设置得更高,它会在每个查询中获取更多记录,但是您需要更多内存来存储特定时刻的所有这些记录。将 chunk_size
设置得较低会减少内存使用量,但会增加对数据库的查询。
不过,您可能对 pagination [Django-doc] 感兴趣。在这种情况下,请求包含 页码 ,而您 return 只有有限数量的记录。这通常更好,因为并非所有客户端本身都需要 all 数据,而且客户端通常需要能够自己处理数据,如果块太大,客户端也可能被淹没。