Как использовать select_for_update для "получения" запроса в Django?

Как говорится в документации по Django, select_for_update возвращает Queryset. Но get нет. Теперь у меня есть запрос, который, я уверен, вернет только один кортеж. Но мне также нужно приобрести блокировки для этой транзакции. Поэтому я делаю что-то вроде:

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

Теперь мне нужно изменить некоторые значения ob. Но ob является a Queryset. Это кажется довольно простым, но бьет меня. Я новичок в Django. Некоторые советы, пожалуйста.

Ответ 1

Просто позвоните get, нарежьте его и т.д. и сохраните как обычно. Блокировка выполняется через транзакцию.

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

Любые изменения совершаются в конце транзакции (которая по умолчанию равна 1,5 для каждого запроса)

Ответ 2

Вы можете использовать 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