如何防止django中读取不一致



我有一个关于django和postgresql的问题。

假设一个进程加载了一些模型。

user = User.objects.get(pk=1)
#user.foo is '' right now
user.foo = 'bar'

当这个进程在做另一个进程在做这个表的事情时

user = User.objects.get(pk=1)
#user.xyz is '' right now
user.xyz = 'xyz'

然后第一个保存,然后另一个。

最后,我将有一个用户模型对象与foo = '和xyz = 'xyz',而我希望foo等于'bar'。

我想应该叫"丢失的更新"之类的。我认为在隔离级别'serializable'中不应该是这样的

Model.save覆盖当前对象属性的所有字段

要只覆盖想要的,你需要指定使用update_fields(从Django 1.5开始可用):

user = User.objects.get(pk=1)
user.foo = 'bar'
user.save(update_fields=['foo'])
# ---
user = User.objects.get(pk=1)
user.xyz = 'xyz'
user.save(update_fields=['xyz'])

参见指定要保存的字段- Django文档。

BTW,如果你不在另一个进程中重新加载user对象,你仍然会看到foo = '', xyz = 'xyz'。重新加载以查看更新后的字段值。

user = User.objects.get(pk=user.pk)

最新更新