Можно ли объединить валидатор модели / формы в 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.

Другие вопросы по тегам