DRF overflowError: значение даты вне диапазона через сериализатор - PullRequest
0 голосов
/ 06 августа 2020

Привет, когда отправляется запрос с данными

[{"valid_from": "0001-01-01T00:00:00",
  "valid_to": "0001-01-01T00:00:00"}]

Как ограничить минимальный год до 2020 года, я попытался добавить валидаторы в модель, но сначала выполняется DRF, поэтому он не работает, как остановить это на уровне DRF. Если они передают date.min в моем сериализаторе, он вызывает overflowError: date value out of range

My solution

class ValidateMinDateSerialier(serializers.Serializer):
    @staticmethod
    def is_date(value):
        if isinstance(value, str):
            return re.findall(r'\d\d\d\d-\d\d-\d\d.+', value)

    def to_internal_value(self, data):
        invalid_dates = []
        for key, value in data.items():
            if self.is_date(value):
                if not re.findall(r'2\d\d\d-\d\d-\d\d.+', value):
                    invalid_dates.append(key)

        error_dict = {field: [_('Invalid date. The year must start with 2xxx')] for field in invalid_dates}

        if error_dict != {}:
            raise serializers.ValidationError(error_dict, code=400)

        return super(ValidateMinDateSerialier, self).to_internal_value(data)

, а затем наследует ValidateMinDateSerialier в моем сериализаторе. Но это нормально?

Я должен поставить его на каждый сериализатор, который принимает даты, есть ли глобальный способ сделать это?

1 Ответ

0 голосов
/ 06 августа 2020

В сериализаторе вы можете проверять отдельные поля

class TestSerializer(serializers.ModelSerializer):  
    class Meta:
    ...

    def validate_valid_from(self, value):
        """
        Check that the blog post is about Django.
        """
        if 'django' not in value.lower():
            raise serializers.ValidationError("Blog post is not about Django")
        return value

Дополнительные сведения о проверке документов процесс проверки.

...