【问题标题】:How can I quickly set a field of all instances of a Django model at once?如何一次快速设置 Django 模型的所有实例的字段?
【发布时间】:2014-10-21 10:22:57
【问题描述】:

澄清一下,我有数千个属性项,每个项都有一个“当前”字段(以及其他)。要重置系统以再次使用,我需要将每个项目的“属性”字段设置为 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”命令外不接受用户输入,所以我觉得原生 SQL 命令是一个安全的选择,但我对 SQL 的了解不足以起草这样的命令。

谢谢大家。

【问题讨论】:

  • 更新怎么样? Property.objects.all().update(present=False)

标签: python django performance django-queryset


【解决方案1】:

使用update 查询:

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

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

【讨论】:

  • 8 秒。这真是太棒了。非常感谢!编辑:要跳板,将其更改为 Property.objects.filter(present=True).update(present=False) 将其降低到 6.5-7 秒。好东西!
猜你喜欢
  • 2019-01-05
  • 2011-04-19
  • 2020-12-05
  • 1970-01-01
  • 2010-12-07
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多