Djangoドキュメントが言うように、select_for_update
はQueryset
を返します。しかし、get
はそうではありません。これで、確実に1つのタプルのみを返すクエリがあります。ただし、このトランザクションのロックを取得する必要もあります。だから私は次のようなことをしています:
ob = MyModel.objects.select_for_update().filter(some conditions)
次に、obのいくつかの値を変更する必要があります。しかし、obはQueryset
です。これはかなりシンプルに思えますが、私には勝っています。私はDjangoを初めて使用します。アドバイスをお願いします。
get
を呼び出してスライスするなどして、通常どおり保存します。ロックはトランザクションを通じて設定されます。
ob = MyModel.objects.select_for_update().get(pk=1)
変更はトランザクションの終わりにコミットされます(デフォルトでは1.5までは要求ごとです)。
あなたは can も使用しますselect_for_update
とget_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