我们知道,更新是线程安全的操作。 意思是,当你这样做的时候:
SomeModel.objects.filter(id=1).update(some_field=100)
而不是:
sm = SomeModel.objects.get(id=1)
sm.some_field=100
sm.save()
您的应用程序相对线程安全,并且操作SomeModel.objects.filter(id=1).update(some_field=100)
不会重写其他模型字段中的数据。
我的问题是。。如果有办法的话
SomeModel.objects.filter(id=1).update(some_field=100)
但是如果物体不存在的话,它会被创造出来吗?
您可以使用Django的内置get_或_create,但它在模型本身上操作,而不是在queryset上操作。
你可以这样使用:
如果有多个线程,则应用程序将需要确定模型的哪个实例是正确的。通常我要做的是从数据库中刷新模型,进行更改,然后保存它,这样就不会有很长时间处于断开连接状态。
我认为,问题中提供的代码并不是很具有示范性:谁想为模型设置id? 假设我们需要这个,我们同时进行操作:
使用
update_or_create
函数,取决于哪个线程优先,对象将被创建和更新,没有例外。这将是线程安全的,但显然用处不大:取决于竞争条件值SomeModek.objects.get(some__unique_field=1).some_field
可以是1或2。Django提供F对象,因此我们可以升级代码:
您需要django的select_for_update()方法(以及支持行级锁定的后端,如PostgreSQL)与手动事务管理相结合。
请注意,如果其他进程删除了两个查询之间的对象,则会出现SomeModel.DoesNotExist异常。
Django 1.7及更高版本还支持原子操作和内置的update_or_create()方法。
相关问题 更多 >
编程相关推荐