Python Django find_每个人(如RoR)
有没有办法在django中使用Python Django find_每个人(如RoR),python,ruby-on-rails,django,Python,Ruby On Rails,Django,有没有办法在django中使用find_each 根据rails文档: 此方法仅适用于大批量生产 无法同时存储在内存中的记录数量。如果你 只需要循环少于1000条记录,可能会更好 只是使用常规的find方法 谢谢。一个可能的解决方案是使用内置的Paginator类(可以节省很多麻烦) 尝试以下方法: from django.core.paginator import Paginator from yourapp.models import YourModel result_query =
find_each
根据rails文档:
此方法仅适用于大批量生产
无法同时存储在内存中的记录数量。如果你
只需要循环少于1000条记录,可能会更好
只是使用常规的find方法
谢谢。一个可能的解决方案是使用内置的
Paginator
类(可以节省很多麻烦)
尝试以下方法:
from django.core.paginator import Paginator
from yourapp.models import YourModel
result_query = YourModel.objects.filter(<your find conditions>)
paginator = Paginator(result_query, 1000) # the desired batch size
for page in range(1, paginator.num_pages + 1):
for row in paginator.page(page).object_list:
# here you can add your required code
从django.core.paginator导入paginator
从yourapp.models导入YourModel
result\u query=YourModel.objects.filter()
paginator=paginator(结果查询,1000)#所需的批量大小
对于范围内的页面(1,paginator.num_pages+1):
对于paginator.page(page).object_列表中的行:
#您可以在这里添加所需的代码
或者,您可以根据需要使用来迭代结果。您可以通过循环和切片查询集来查询整个表的部分内容 如果使用的是Debug=True,则在每次循环后刷新查询非常重要,因为这可能会导致内存问题(Django存储在脚本完成或终止之前运行的所有查询) 如果需要限制查询集的结果,可以将“.all()”替换为相应的“.filter(conditions)” 来自django导入数据库的
从myapp导入MyModel
#获取表中记录的总数
total_count=MyModel.objects.all().count()
chunk_size=1000#您可以将其更改为内存中可以保留的任何数量
检查的总数=0
检查总计数<总计数:
#查询所有对象并仅切片需要工作的零件
#此时使用(仅该部分将加载到内存中)
query\u set=MyModel.objects.all()[total\u checked:total\u checked+chunk\u size]
对于查询集合中的项:
#对结果做你需要做的事情
通过
检查的总大小+=块大小
#清除django的查询缓存以避免内存泄漏
db.reset_查询()
这当然解决了问题。但每种模型都应该这样做。在ruby中,有一种通用的方法来实现这一点。
from django import db
from myapp import MyModel
# Getting the total of records in the table
total_count = MyModel.objects.all().count()
chunk_size = 1000 # You can change this to any amount you can keep in memory
total_checked = 0
while total_checked < total_count:
# Querying all the objects and slicing only the part you need to work
# with at the moment (only that part will be loaded into memory)
query_set = MyModel.objects.all()[total_checked:total_checked + chunk_size]
for item in query_set:
# Do what you need to do with your results
pass
total_checked += chunk_size
# Clearing django's query cache to avoid a memory leak
db.reset_queries()