django - 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
- 这并不总是发生。
难道是更新在保存后以某种方式运行?还是我需要在其他地方寻找问题?
解决方案
Django更新和保存异步?
不,Django 的update
和save
不是异步的。
难道是更新在保存后以某种方式运行?
对的,这是可能的。
我怀疑正在发生的事情是,当 Django 告诉您的数据库执行更新时,您的数据库会立即告诉 Django 更新已经发生,同时它在后台执行更新。
因此,您的 Django 代码继续执行下一条语句,因为它已从数据库中获得响应。
还是我需要在其他地方寻找问题?
是的。也许在您的数据库的 SO 标签或邮件列表下问这个问题。我能想到的一个简单解决方法是在更新发生时显式锁定您的表。虽然我不确定什么是最好的方法,因为我没有太多使用数据库的经验。
推荐阅读
- node.js - MongoDB (Mongoose) - 仅获取嵌套项等于值的记录
- python - 如何在 Python 中使用带有 WxWidgets 的 WxFormBuilder 拥有多个上下文菜单
- firebase - 使用 Cloud Firestore 为每个帖子实现评论部分
- python - Python 中的标准缩放器
- c++ - 从 1 到 n 的二进制数的计数
- android - 在 Android 11 设备上将目标版本更新为 30 后,从意图打开 Android 地图并从意图拨打电话不起作用
- python - 保留对索引的 Python 引用
- .net - 是否有关于 2008 版 System.Windows.Forms ( Microsoft.Practices.CompositeUI ) 的文档
- r - 如何在 R 中对这些数据进行质量检查?
- linux - 无法在 Ubuntu 上下载 ROS-Melodic-Desktop-Full(设备上没有剩余空间)