python - django,属性更新模型实例

标签 python django django-models django-queryset

1. instance.save()

2. instance.foo = foo; instance.save(update_fields=['foo'])

3. InstanceClass.objects.filter(id=instance.id).update(foo=foo)

我发现#3有时不可靠。
在我运行 #3 之后,偶尔 foo 没有正确设置(未提交?)

当我不想运行信号处理程序时,我曾经使用#3。

什么时候使用以上 3 个?

最佳答案

如果您只是更新记录而不需要对模型对象做任何事情,最有效的方法是调用 update(),而不是将模型对象加载到内存中.例如,而不是这样做:

instance = Entry.objects.get(id=10)
instance.comments_on = False
instance.save()

这样做:

Entry.objects.filter(id=10).update(comments_on=False)

注意:

  1. 使用 update() 还可以防止出现竞争情况,在这种情况下,在加载对象和调用 save() 之间的短时间内,您的数据库中的某些内容可能会发生变化。*
  2. update() 在 SQL 级别进行更新,因此不会调用任何 save(),因此如果您有一个覆盖的 save( ) 方法,您必须使用第一种方法与 get()save()

检查 Queryset文档,这里都有解释。

关于python - django,属性更新模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34371959/

相关文章:

python - 父类(super class)中的调用方法没有给出我期望的输出?

python - 异步长时间运行操作 API 调用

html - 如何显示选定的导航选项卡

django - django 中 pre_delete 信号中的当前用户

python - python图像库(PIL)中的getbbox方法不起作用

python - 如何在 Docker 中运行的 Jupyter Notebook 中获取代码补全

python - 我可以在 django 模型中指定连接策略吗?

python - 在 Django 中使用多个数据库,让另一个数据库包含不是由任何模型创建的表

python - pandas 读取 sql db2 损坏十进制

Python PIL 和 StringIO