Django的objects.all()杀死了python

时间:2012-09-03 19:53:34

标签: python django

我有一个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(只是打印'杀死')。

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

3 个答案:

答案 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