Django - Deserializing JSONField in DRF

Viewed 2255

I've a JSONField in model, lets say x. I'm using DRF to save the model instance.

Serializer:-

class ABCSerializer(serializers.ModelSerializer):

    class Meta:
        model = ABC
        fields = ('x', )

    def create(self, data):
         instance = ABC.objects.create(**data)
         instance.x = {'key': 'value'}
         instance.save()

When I POST the data, the response returned by creating the object is correctly deserialized, ie

{
    'id': 1,
    'x': {
        'key': 'value'
    }
} 

However, when I GET the data using the id, it return x as str, ie

{
    'id': 1,
    'x': "{\"key\": \"value\"}"
} 

How can I properly deserialize the data back to json?

1 Answers

You can override the to_internal_value and to_representation in a new serializer field to handle the return data for JSON field.

class JSONSerializerField(serializers.Field):
    """Serializer for JSONField -- required to make field writable"""

    def to_internal_value(self, data):
        return data

    def to_representation(self, value):
        return value

And in turn, you would use this Field in your ABCSerializer:

class ABCSerializer(serializers.ModelSerializer):
    x = JSONSerializerField()

    class Meta:
        model = ABC
        fields = ('x', )

This should solve your problem :)

Related