# -*- coding: utf-8 -*- import json # Third party import six from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers class SingleTag(str): def __init__(self, *args, **kwargs): pass def __str__(self): return json.dumps(self) class SingleTagSerializerField(serializers.Field): child = serializers.CharField() default_error_messages = { 'invalid_json': _('Invalid json str. A tag list submitted in string' ' form must be valid json.'), '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, six.string_types): 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