我想对一个类型可能有所不同的对象进行原子更新。结构看起来像这样:
class MyMixin(models.Model):
size = models.BigIntegerField(null=False, default=0)
class SubClassA(MyMixin, models.Model):
<...>
class SubClassB(MyMixin, models.Model):
<...>
# obj is of type SubClassA or SubClassB
def some_func(obj):
with db.transaction.atomic():
# obj = SubClassA.objects.select_for_update().get(id=obj.id) # How do I do this?
obj.size = calculate()
obj.save()
我可以找到的所有示例都明确地使用<Class>.objects.select_for_update()
模式,但是我的问题是我不知道类在运行时将是什么。在我的代码中,我已经有对象/模型的实例,但是我需要从数据库中重新获取它以锁定它。
我正在尝试从本指南中的“悲观方法”中汲取思想-https://medium.com/@hakibenita/how-to-manage-concurrency-in-django-models-b240fed4ee2
我应该在MyMixin
中放置一个非常简单的方法,让我设置和保存size
吗?或者我可以在运行时显式检查type
中的obj
,并拥有一堆elif
(以进行类似if/elif type(obj) == SubClassA: SubClassA.objects.select_for_update()...
的操作),但这既丑陋又不太容易维护
答案 0 :(得分:2)
您始终可以从其__class__
属性中获取对象的类。所以:
obj = obj.__class__.objects.select_for_update().get(id=obj.id)