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

Cha*_*nce 2 python django performance django-queryset

澄清一下,我有数千个 Property 项目,每个项目都有一个“present”字段(等等)。要重置系统以再次使用,我需要将每个项目的“属性”字段设置为 false。现在,当然有一个简单的方法来做到这一点,那就是:

for obj in Property.objects.all():
    obj.present = False
    obj.save()
Run Code Online (Sandbox Code Playgroud)

但这在我的开发服务器上需要近 30 秒。我觉得一定有更好的方法,所以我尝试使用 Django 的查询集限制加载的字段only:

for obj in Property.objects.only('present'):
    obj.present = False
    obj.save()
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,这实际上比获取整个对象花费的时间更长。

因为我需要不加选择地将所有这些值设置为 False,有没有更快的方法?除了“go do it”命令之外,此函数不接受任何用户输入,因此我觉得本机 SQL 命令将是一个安全的选项,但我对 SQL 的了解不足以起草这样的命令。

谢谢大家。

Ash*_*ary 5

使用update查询:

Property.objects.all().update(present=False)
Run Code Online (Sandbox Code Playgroud)

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