django - 以原子方式更新和获取 Django 模型对象
问题描述
我想要一种以原子方式更新和读取对象的能力。例如,下面 update() 之上的 first() 之类的:
obj = MyModel.objects.filter(pk=100).update(counter=F('counter') + 1).first()
我知道这是一个尴尬的结构。但只是想表明我的需要。
作为记录,我使用了类方法,例如:
@classmethod
def update_counter(cls, job_id):
with transaction.atomic():
job = (cls.objects.select_for_update().get(pk=job_id))
job.counter += 1
job.save()
return job
我会在下面调用并获取我更新的obj。
my_obj = my_obj.update_counter()
但问题是,是否有任何其他 django 模型技术,因为这种回读很常见,并且可能被多个线程用来根据最终计数得出结论。
解决方案
深入挖掘我找不到任何直接的方法来获取我以 sql 链接方式更新的对象。正如 Dani Herrera 在上面评论的那样,更新和读取必须是两个 sql 查询。因此,唯一可以帮助我满足该要求的机制是我在上面也包含的类方法。事实上,它可以帮助我以后在同一个类方法中原子地添加额外的字段更新。
例如,该方法很可能是“def update_progress(job_id, final_desired_count)”,我可以在其中更新更多字段,例如“self.progress_percentage = (self.counter / final_desired_count) * 100”。
类方法方法对我来说可能是一项不错的投资。
推荐阅读
- python - 如何重试代码 5 次,每次尝试之间有 5 秒的间隔
- python - 在参数中不使用“:”的gridspec?
- windows - 使用 CFileDialog::AddCheckButton 失败
- r - md.pattern() 在 library(mice) 之后不起作用
- c# - Nuget 说由于 .NET Framework 不兼容而无法安装 octopack 创建的 nuget
- ruby-on-rails - 使用 link_to 助手生成的 Ruby on Rails 链接在 Chrome 中不再有效
- python - matplotlib 绘制两行不同类型数组的总和
- php - 删除单个路径的页面超时?
- laravel - Laravel 身份验证或 Laravel 和 vuejs 身份验证的混合
- c++ - 有没有办法在 C++ 中创建一个循环数组