Объект модели не создается изнутри блока except или непосредственно перед возникновением исключения
В моем приложении Django происходит что-то очень странное. Когда я пытаюсь выполнить следующий код
Model.objects.create(**obj)
перед тем, как поднять исключение ИЛИ запустить тот же код внутри блока except, код выполняется без проблем, но я не могу увидеть объект в базе данных. Выполнение Model.objects.all() также ничего не возвращает.
Вот полный код:
def has_permission(self, request, view):
try:
serializer = VerifyOTPRequestSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
otp = request.data.pop("otp")
flow = request.data.pop("flow")
primary_phone = request.data.get("contact_detail", {}).get(
"primary_phone", ""
)
if OTPFailedAttempts.objects.filter(phone=primary_phone).count() > 0:
raise Exception("otpAttemptError")
return helpers.OTPHelper.verify_otp(primary_phone, otp, flow)
except Exception as permission_error:
OTPFailedAttempts.objects.create(**{"phone": primary_phone, 'email': email})
return False
Есть ли конкретная причина, по которой Django не позволяет создавать объекты вокруг исключений или я делаю что-то не так?
Проблема в том, что ваши запросы являются атомарными, поскольку вы установили ATOMIC_REQUESTS
на True
в настройках.
Django Rest Framework имеет метод check_permissions
, который вызывает метод has_permission
всех классов разрешений представления, если любой из них возвращает False
(или ложное значение), то возникает исключение (Ссылка: GitHub code).
Поскольку ваш метод has_permission
возвращает False
, это вызывает исключение. Учитывая, что вы установили ATOMIC_REQUESTS = True
(Django Rest Framework имеет код для соответствия этой настройке), это приводит к откату ваших изменений. Решением будет удалить ATOMIC_REQUESTS
и обрабатывать это самостоятельно, используя декоратор / менеджер контекста, предоставляемый Django.