Django:关于外键关系的select_for_update()

时间:2018-07-05 18:48:00

标签: django django-models django-queryset

我经常使用select_for_update()。但是,在我使用过的所有情况下,都是通过这样的管理器进行的:

with transaction.atomic():
    transaction = Transaction.objects.select_for_update().get(id="12345-6789-10")
    transaction.status = StatusEnum.APPROVED
    transaction.save()

但是,有时我会通过另一个对象的引用来获取交易。

例如:

transaction = another_object.transaction
transaction.status=StatusEnum.APPROVED
transaction.save()

^^这不会锁定该行。相反,我必须这样做:

transaction = Transaction.objects.select_for_update().get(id=another_object.transaction.id)

我的问题:如果另一个对象与事务具有外键关系,是否可以在不编写get查询的情况下锁定Transaction对象?我了解性能方面,这两种选择大致相同。只是在寻找更清洁的东西。谢谢!

1 个答案:

答案 0 :(得分:0)

自升级到Django 2.0以来,我已经找到了答案。在GitHub上查看此答案:

django select_for_update and select_related on same query?

您可以将select_related与select_for_update一起使用,这将锁定每个表中的相应行。