Можно ли объединить валидатор модели / формы в Django-Rest-Framework?
Я заметил, что валидаторы форм и моделей Django должны поднять django.core.exceptions.ValidationError
, который является непосредственным подклассом Exception
,
Однако в DRF мой валидатор должен повысить rest_framework.exceptions.ValidationError
, который не является потомком Джанго (происходит от rest_framework.exceptions.APIException(Exception)
).
Сохраняя СУХОЙ, как я могу написать валидатор один раз и использовать его, скажем, в формах Django и сериализаторе DRF?
Вот связанный вопрос, где DRF не ловит ядро Django ValidationError
1 ответ
Я использую django==1.8 и DRF==3.3.2, и я только что написал собственный валидатор в своем проекте и заметил, что исключения из django.core и restframework ValidationError работают одинаково хорошо в DRF. Я думаю, что это связано с этим кодом в rest_framework.fields:
from django.core.exceptions import ValidationError as DjangoValidationError
from rest_framework.exceptions import ValidationError
...
def run_validators(self, value):
"""
Test the given value against all the validators on the field,
and either raise a `ValidationError` or simply return.
"""
errors = []
for validator in self.validators:
if hasattr(validator, 'set_context'):
validator.set_context(self)
try:
validator(value)
except ValidationError as exc:
# If the validation error contains a mapping of fields to
# errors then simply raise it immediately rather than
# attempting to accumulate a list of errors.
if isinstance(exc.detail, dict):
raise
errors.extend(exc.detail)
except DjangoValidationError as exc:
errors.extend(exc.messages)
if errors:
raise ValidationError(errors)
Как видите, DRF может перехватывать оба исключения, поэтому вы можете использовать django.core.exceptions.ValidationError как в формах django, так и в DRF.