如何快速设置Django模型的所有实例的字段?

时间:2014-08-27 17:47:12

标签: python django performance django-queryset

为了澄清,我已经收到了数以千计的物业项目,每项物品都有一个“礼物”。领域(以及其他)。要重置系统以便再次使用,我需要设置每个项目的属性'字段为false。现在,当然有简单的方法,只需:

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,是否有更快的方法?除了“去做”之外,此功能不会输入任何用户输入。命令,所以我觉得原生SQL命令是一个安全的选择,但我不知道SQL足以起草这样的命令。

谢谢大家。

1 个答案:

答案 0 :(得分:4)

使用update查询:

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

请注意,update()查询在SQL级别运行,因此如果您的模型具有自定义save()方法,则不会在此处调用它。在这种情况下,您正在使用的正常for循环版本是可行的方法。