Я прикрепил свой код сериализатора.
Я работаю с 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')