Django: select_for_update() 关于外键关系

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

最佳答案

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

django select_for_update and select_related on same query?

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

关于Django: select_for_update() 关于外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51198048/

相关文章:

python - 为什么 pip 始终无法安装 pytest-django? .dist-info 目录未找到错误

javascript - 通过从 URL 获取百分比在 Django 中添加进度栏

python - 如何在单个查询集中组合两个 django 模型对象值

python - 限制 *Large* Django QuerySet 中的内存使用

升级到 1.8.1 后 Django 管理员中断

javascript - 使用 javascript 从模板调用函数

python - 使用模型在 Django 中创建 JSON 响应

django - 在Django中将数据从 “Many-To-Many”迁移到 “Many-To-Many Through”

django - 如何在 Django 中过滤连接模型?

python - django 从查询集上的反向一对多关系添加列