Django REST Framework: преобразовать значение перед проверкой - PullRequest
2 голосов
/ 07 мая 2019

У меня есть следующая модель:

class Runner(Base):
    # ...
    progress = models.DecimalField(
        max_digits=5,
        decimal_places=4
    )

Я хочу, чтобы пользователь мог ввести 20, а число было преобразовано в 0,20. Я уже делал это в форме, используя метод clean.

def clean_progress(self):
    progress = self.cleaned_data.get('progress')
    if progress is not None:
        progress /= 100
    return progress

Кто-нибудь знает, как это сделать в REST API? Я нашел только метод validate_progress, но он не работает с этим методом, потому что перед его проверкой возникает ошибка «Убедитесь, что до десятичной точки не более 1 цифры».

1 Ответ

3 голосов
/ 07 мая 2019

DRF вызывает to_internal_value для преобразования закодированных данных запроса в типы данных python перед обработкой явной проверки этих объектов python. Ошибка, которую вы видите, вызвана в DecimalField.to_internal_value.

На мой взгляд, самый простой способ справиться с этим - сообщить DRF, как вы ожидаете получить данные запроса, разрешить serializers.DecimalField перевести запрос в python, а затем обработать преобразование в методе validate_progress сериализатору. Примерно так (наверное, по имени вашего сериализатора и базовому классу):

class RunnerSerializer(serializers.ModelSerializer):
    progress = serializers.DecimalField(
        max_digits=5,
        decimal_places=2
    )
    ...
    def validate_progress(self, value):
        if not value:
            return value
        return value/100

ПРИМЕЧАНИЕ: вы также можете сделать десятичное поле более разрешающим на уровне сериализатора, чем округлить в методе validate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...