【问题标题】:Django: select_for_update() on Foreign Key RelationDjango:关于外键关系的 select_for_update()
【发布时间】:2018-12-14 08:00:53
【问题描述】:

我经常使用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 查询的情况下锁定事务对象?我了解性能方面的两个选项大致相同。只是寻找一些更清洁的东西。谢谢!

【问题讨论】:

  • 找到this
  • 感谢@daka。自从几年前提出这个问题以来,我找到了使用 Django 2.0+ 的适当方法。自从回答。

标签: django django-models django-queryset


【解决方案1】:

自从升级到 Django 2.0 后,我找到了答案。在 GitHub 上查看这个答案:

django select_for_update and select_related on same query?

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

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2016-07-29
    • 2012-10-10
    • 1970-01-01
    • 2013-07-20
    • 2020-01-02
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多