from rest_framework import serializers class SingleTag(str): def __init__(self, *args, **kwargs): pass def __str__(self): return self class SingleTagSerializerField(serializers.Field): child = serializers.CharField() default_error_messages = { 'not_a_str': 'Expected a string but got type "{input_type}".', } order_by = None def __init__(self, **kwargs): super(SingleTagSerializerField, self).__init__(**kwargs) def to_internal_value(self, value): if isinstance(value, str): if not value: value = "" if not isinstance(value, str): self.fail('not_a_str', input_type=type(value).__name__) return value def to_representation(self, value): if not isinstance(value, SingleTag): if not isinstance(value, str): value = value.name value = SingleTag(value) return value