任意对象的Django select_for_update()

时间:2019-04-18 07:44:34

标签: python django django-models

我想对一个类型可能有所不同的对象进行原子更新。结构看起来像这样:

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()...的操作),但这既丑陋又不太容易维护

1 个答案:

答案 0 :(得分:2)

您始终可以从其__class__属性中获取对象的类。所以:

obj = obj.__class__.objects.select_for_update().get(id=obj.id)