Можно ли объединить валидатор модели/формы в Django-Rest-Framework?

Я заметил, что валидаторы форм и моделей Django должны вызывать django.core.exceptions.ValidationError, который является непосредственным подклассом Exception.

Однако в DRF ожидается, что мой валидатор поднимет rest_framework.exceptions.ValidationError, который не является потомком Django (происходит от rest_framework.exceptions.APIException(Exception)).

Сохраняя себя СУХИМ, как я могу написать валидатор один раз и использовать его как, скажем, в формах Django, так и в сериализаторе DRF?

Здесь связанный вопрос, где DRF не улавливает ядро ​​Django ValidationError


person bavaza    schedule 10.01.2017    source источник


Ответы (1)


Я использую django==1.8 и DRF==3.3.2, и я только что написал собственный валидатор в своем проекте и заметил, что исключения ValidationError django.core и restframework одинаково хорошо работают в 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.

person Fine    schedule 11.01.2017
comment
Сладкий :). не в первый раз - чтение кода лучше чтения документов. - person bavaza; 11.01.2017