35

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

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

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

4

2 回答 2

48

只需调用get、切片等并照常保存。锁通过事务到位。

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

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

于 2013-06-18T02:36:13.170 回答
36

可以使用select_for_updatewithget_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
于 2015-10-31T18:51:48.693 回答