首页 > 解决方案 > 以原子方式更新和获取 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 模型技术,因为这种回读很常见,并且可能被多个线程用来根据最终计数得出结论。

标签: djangodjango-models

解决方案


深入挖掘我找不到任何直接的方法来获取我以 sql 链接方式更新的对象。正如 Dani Herrera 在上面评论的那样,更新和读取必须是两个 sql 查询。因此,唯一可以帮助我满足该要求的机制是我在上面也包含的类方法。事实上,它可以帮助我以后在同一个类方法中原子地添加额外的字段更新。

例如,该方法很可能是“def update_progress(job_id, final_desired_count)”,我可以在其中更新更多字段,例如“self.progress_percentage = (self.counter / final_desired_count) * 100”。

类方法方法对我来说可能是一项不错的投资。


推荐阅读