2014-08-27 46 views
2

为了澄清,我有几千个属性项目,每个都有一个'present'字段(等等)。要重置系统以再次使用,我需要将每个项目的“属性”字段设置为false。现在,当然还有最简单的方式做到这一点,这就是:如何快速设置一个Django模型的所有实例的字段?

for obj in Property.objects.all(): 
    obj.present = False 
    obj.save() 

但是,这需要近30秒我的开发服务器上。我觉得必须有一个更好的办法,所以我试图用限制Django的only查询集加载的字段:

for obj in Property.objects.only('present'): 
    obj.present = False 
    obj.save() 

无论出于何种原因,这其实需要更长刚开整个对象。

因为我需要将所有这些值不加区分地设置为False,有没有更快的方法?除了'go do it'命令之外,这个函数没有用户输入,所以我觉得一个原生的SQL命令是一个安全的选择,但我不知道SQL足以起草这样的命令。

谢谢大家。

+0

如何更新? 'Property.objects.all()。update(present = False)' – karthikr 2014-08-27 17:50:29

回答

4

使用update查询:

Property.objects.all().update(present=False) 

注意update()查询在SQL级上运行,所以如果你的模型有一个自定义的save()方法则是不会就在这里调用。在这种情况下,您正在使用的正常的for-loop版本是要走的路。

+0

8秒。这真是太棒了。非常感谢你!编辑:跳板,将其更改为Property.objects.filter(present = True).update(present = False)将其降至6.5-7秒。好东西! – Chance 2014-08-27 17:56:32

相关问题