1

我有一个 Django 项目。里面有MyModelmodels.py该模型有 4 000 000 个实例。

我执行这个脚本:

for m in MyModel.objects.all():
    if len(m.phone) < 10 or len(set(m.phone)) <= 2:
        m.delete()

但是,它杀死了 python(只是打印'Killed')。

我知道,问题在于实例数量。但是我怎样才能迭代所有这些?

4

3 回答 3

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
于 2012-09-03T20:09:47.980 回答
4

如果你使用iterator()而不是all(),Django 将不会缓存查询集,这应该会减少内存使用并提高性能。

for m in MyModel.objects.iterator():
    # doing something with m
于 2012-09-03T20:39:59.730 回答
0

Alexey 的回答非常好,但他认为余数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
于 2014-10-21T07:42:28.820 回答