Объект модели не создается изнутри блока 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.

Вернуться на верх