如何使用“select_for_update()”在 Django 中获取一个对象?

新手上路,请多包涵

正如 Django 文档所说, select_for_update 返回一个 Queryset 。但是 get 没有。现在我有一个查询,我确信它只会返回一个元组。但是我还需要为这个事务获取锁。所以我正在做类似的事情:

 ob = MyModel.objects.select_for_update().filter(some conditions)

现在,我需要修改 ob 的一些值。但是 ob 是一个 Queryset 。这看起来很简单,但打败了我。我对 Django 很陌生。请提供一些建议。

原文由 Indradhanush Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 644
2 个回答

只需调用 get ,对其进行切片等,然后照常保存。通过事务锁定到位。

 ob = MyModel.objects.select_for_update().get(pk=1)

任何更改都在事务结束时提交(默认情况下到 1.5 是每个请求)

原文由 Yuji ‘Tomita’ Tomita 发布,翻译遵循 CC BY-SA 3.0 许可协议

可以将 select_for_updateget_object_or_404 函数一起使用:

 from django.db import transaction
from django.shortcuts import get_object_or_404

with transaction.atomic():
    obj = get_object_or_404(MyModel.objects.select_for_update(), pk=pk)
    # do some stuff with locked obj

原文由 Omid Raha 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题