Django更新并保存异步?

我们有一个只允许其中一个实例处于活动状态的模型:

class MyModel(models.Model):
   active = models.BooleanField()

   def save(self, *args, **kwargs):
       if self.active:
           MyModel.objects.update(active=False)
       super(MyModel, self).save(*args, **kwargs)

这似乎有效,通过简单测试以确保只有一个实例处于活动状态.

但是,它最近在我们的生产服务器上使用,并且看起来好像在保存之后执行更新调用,因此所有实例最终都以active = False结束 – 这不会一直发生.

可能是保存后以某种方式运行更新?或者我是否需要寻找其他问题?

最佳答案

Django update and save asynchronous?

不,Django的更新和保存不是异步的.

Could it be that the update is running after the save somehow?

对的,这是可能的.

我怀疑正在发生的事情是,当Django告诉您的数据库执行更新时,您的数据库会立即告诉Django在后台执行更新时发生了更新.

因此,您的Django代码继续执行下一个语句,因为它已从数据库获得响应.

Or do I need to look elsewhere for the issue?

是.也许在您的数据库的SO标签或邮件列表下提出这个问题.我能想到的一个简单修复是在更新发生时显式锁定表.虽然我不确定什么是最好的方法,因为我没有太多使用数据库的经验.

点赞