Код: Выделить всё
class SomeSerializer(serializers.Serializer):
number_field = serializers.IntegerField(required=False, min_value=25, max_value=100)
Код: Выделить всё
REST_FRAMEWORK = {
other settings....
'EXCEPTION_HANDLER': 'apps.utils.exceptions.custom_exception_handler',
}
Код: Выделить всё
def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first
response = exception_handler(exc, context)
messages = None
code = None
detail = None
if response is not None:
# Map specific exceptions to custom error codes
if isinstance(exc, ValidationError):
code = "validation_error"
detail = "One or more fields failed validation."
messages = exc.detail
status_code = status.HTTP_400_BAD_REQUEST
# After checking for other errors here in between
else:
code = "unexpected_error"
detail = response.data.get("detail", "An unexpected error occurred.")
messages = response.data.get("messages", {"error": str(exc)})
"""
In between the if and else, AuthenticationFailed, PermissionDenied, NotFound, are handled. Add an appropriate code and return in the format
response.data = {
"detail": detail,
"code": code,
"messages": messages
}
"""
Код: Выделить всё
{
"detail": "One or more fields failed validation.",
"code": "validation_error",
"messages": {
"number_field": [
"Ensure this value is greater than or equal to 25."
]
}
}
Код: Выделить всё
"""
In case of manual validation, the field will be
number_field = serializers.IntegerField(required=False)
"""
# manual validation in validate method
def validate(self, data):
num = data.get('number_field')
if num and (num < 25 or num > 100)::
raise serializers.ValidationError("number_field value must be between 25 and 100")
"""
Returns
{
"non_field_errors": [
"number_field value must be between 25 and 100"
]
}
"""
# or
def validate_number_field(self, value):
if value and (value < 25 or value > 100):
raise serializers.ValidationError("value must be between 25 and 100")
"""
Returns
{
"number_field": [
"value must be between 0 and 100"
]
}
"""
Один из способов получить формат ошибок из пользовательского обработчика исключений с определенными min_value и max_value поле сериализатора должно было переопределить метод to_internal_value и обработать там ValidationError.
Код: Выделить всё
def to_internal_value(self, data):
try:
return super().to_internal_value(data)
except serializers.ValidationError as exc:
raise serializers.ValidationError({
"detail": "One or more fields failed validation.",
"code": "validation_error",
"messages": exc.detail
})
Подробнее здесь: https://stackoverflow.com/questions/792 ... -return-er
Мобильная версия