35

Django Documentation が言うように、 をselect_for_update返しますQueryset。しかし、getそうではありません。これで、タプルを 1 つだけ返すと確信しているクエリがあります。しかし、このトランザクションのロックも取得する必要があります。だから私は次のようなことをしています:

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

ここで、 の値をいくつか変更する必要がありますob。しかしobQuerysetです。これはかなり単純に思えますが、私を打ち負かします。私は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_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
于 2015-10-31T18:51:48.693 に答える