我有一个Django项目。 MyModel
中有models.py
。这种模式有4 000 000个实例。
我打了这个剧本:
for m in MyModel.objects.all():
if len(m.phone) < 10 or len(set(m.phone)) <= 2:
m.delete()
但是,它会杀死python(只是打印'杀死')。
我知道,问题在于实例数量。 但我怎么能迭代所有这些呢?
答案 0 :(得分:6)
您可以先尝试计算对象,然后使用切片版本进行迭代。类似的东西:
step = 10
count = MyModel.objects.count()/step
for i in xrange(count):
for m in MyModel.objects.all()[i*step:(i+1)*step]:
# doing something with m
答案 1 :(得分:4)
如果使用iterator()
而不是all()
,Django将不会缓存查询集,这会减少内存使用并提高性能。
for m in MyModel.objects.iterator():
# doing something with m
答案 2 :(得分:0)
阿列克谢的答案非常好,但他认为MyModel.objects.count()/step
的余数为零
所以,他可能会遗漏一些领域......
step = 10
total = MyModel.objects.count()
count = total//step
if (total % step != 0):
count += 1
for i in xrange(count):
first = i*step
last = first + step - 1
if last >= total:
last = total
for m in MyModel.objects.all()[first:last]:
# doing something with m