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

标签 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,有没有更快的方法?除了“go do it”命令外,此函数不接受任何用户输入,因此我认为 native SQL 命令是一个安全的选择,但我对 SQL 的了解不足以起草这样的命令。

谢谢大家

最佳答案

使用 update查询:

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

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

关于python - 如何一次快速设置 Django 模型的所有实例的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25533837/

相关文章:

django - 有什么理由不在 Django 中将 USE_ETAGS 与 CommonMiddleware 一起使用?

python - xlsxwriter 消耗太多内存并且进程被终止

python - 如何在绑定(bind)方法中获取实例名称?

javascript - 如何检查脚本依赖性?

algorithm - 合并 K 个长度为 N 的排序数组

python - 在 matplotlib 中更改标记的大小

python - 什么是 tf.losses.absolute_difference 的替代品

java - 字符串与字符串缓冲区。 IDEA提示

python - 通过 "python setup.py test"将命令行参数传递给 nose

python - 我可以通过提供项目名称来引用 Django 模板中的项目 URL 吗?