Как разрешить пустые строки в полях datetime сериализатора Django - PullRequest
0 голосов
/ 30 марта 2020

Я прикрепил свой код сериализатора.

Я работаю с Django Rest Framework. Обычно вы можете настроить сериализатор менее чем на 5 строк кода, но это не так. Проблема заключается в том, что FE отправляет date_start или date_end в виде пустой строки вместо нуля, когда пользователь не установил их внутри формы.

В текущем коде, чтобы позволить FE передавать date_start и date_end в виде пустой строки, я установил для них временное непустое значение, чтобы проверка работала, и, прежде чем сохранять данные в DB, я возвращаю это специальное значение None. Все работает ... но ...

Я знаю, что это уродливое решение, есть ли лучший способ передать date_time как "" вместо нуля?

Я должен использовать Django 1.10


class RulesSerializer(serializers.Serializer):

    __None__ = "__None__"
    nullable_fields = ( 'date_end', 'rules', 'date_start', 'price_base')

    id = serializers.IntegerField()
    country_code = serializers.CharField()
    operator_name = serializers.CharField()
    operator_id = serializers.IntegerField()
    calculation_base = serializers.CharField()
    price_base = serializers.CharField(required=False)
    rules = serializers.CharField(required=False)
    value_format = serializers.CharField()
    value = serializers.FloatField()
    date_start = serializers.CharField(required=False)
    date_end = serializers.CharField(required=False)

    def to_rapresentation(self, instance):
        return super(RulesSerializer,self).to_rapresentation(instance)

    def to_internal_value(self, data):

        for field in self.nullable_fields:
            if field in data:
                data[field] = data[field] or self.__None__
        return super(RulesSerializer, self).to_internal_value(data)

    def update(self, instance, validated_data):
        logger.info("now executes the update for the not allowed blank fields")
        for field in self.nullable_fields:
            if field not in validated_data:
                continue
            if validated_data[field] == self.__None__:
                validated_data[field] = None

        for field in validated_data.keys():
            setattr(instance, field, validated_data[field])

        instance.save()
        return instance

    def create(self, validated_data): 
        for field in self.nullable_fields:
            if field not in validated_data:
                continue
            if validated_data[field] == self.__None__:
                validated_data[field] = None
        new_rule = Rules()
        for field in validated_data:
            setattr(new_rule, field, validated_data[field])

        new_rule.save()
        return new_rule 

    class Meta:
        fields = '__all__'
        model = Rules
        read_only_fields = list('id')
...