首页 > 解决方案 > Django更新和保存异步?

问题描述

我们有一个模型,它只允许它的一个实例active

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)

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

但是,它最近在我们的生产服务器上使用,并且表现得好像update调用是在保存之后执行的,因此所有实例都以结束active=False- 这并不总是发生。

难道是更新在保存后以某种方式运行?还是我需要在其他地方寻找问题?

标签: djangodjango-models

解决方案


Django更新和保存异步?

不,Django 的updatesave不是异步的。

难道是更新在保存后以某种方式运行?

对的,这是可能的。

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

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

还是我需要在其他地方寻找问题?

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


推荐阅读