我有一个关于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)