Как использовать 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