web-dev-qa-db-ja.com

select_for_updateを使用してDjangoでクエリを「取得」する方法

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

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

次に、obのいくつかの値を変更する必要があります。しかし、obはQuerysetです。これはかなりシンプルに思えますが、私には勝っています。私はDjangoを初めて使用します。アドバイスをお願いします。

25

getを呼び出してスライスするなどして、通常どおり保存します。ロックはトランザクションを通じて設定されます。

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

変更はトランザクションの終わりにコミットされます(デフォルトでは1.5までは要求ごとです)。

33

あなたは can も使用します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
24
Omid Raha