# Middleware для обработки пользовательских исключений
class CustomExceptionsHandler:
EXCEPTION_MESSAGES = {
NoSelectedObjects: (404, "Не найдены выбранные объекты"),
NonEditFieldsWereTouched: (400, "Вы попытались изменить неизменяемое поле"),
NestedObjectsDontExist: (400, "Вы ввели несуществующие вложенные объекты")
} # определяет текст сообщений, которые отправляются пользователю в случае вызова какого-либо исключения
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_exception(self, request, exception):
if type(exception) in CustomExceptionsHandler.EXCEPTION_MESSAGES.keys():
return HttpResponse(status=CustomExceptionsHandler.EXCEPTION_MESSAGES[type(exception)][0], content={CustomExceptionsHandler.EXCEPTION_MESSAGES[type(exception)][1]})
elif type(exception) is IntegrityError:
return HttpResponse(status=400, content=str(exception).split('\n')[0]) # если исключение касается нарушений ограничений базы данных, возвращается информативная часть исключения, говорящая о том, какое ограничение нарушено
new row for relation "orders_order" violates check constraint "Allowable status values"
class Meta:
constraints = [
models.CheckConstraint(
check=models.Q(
status__gte=1, status__lte=3
),
name="Allowable status values",
violation_error_message="Кодовый номер статуса не может быть меньше 1 или больше 3",
),
models.UniqueConstraint(fields=['table_number'], name='unique_table_number',
violation_error_message="Номер стола уже занят"),
]