Django - DRF中反序列化JSONField

4
我有一个模型中的JSONField,假设为x。我正在使用DRF保存模型实例。
序列化器:-
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()

当我提交数据时,创建对象后返回的响应被正确地反序列化了。
{
    'id': 1,
    'x': {
        'key': 'value'
    }
} 

然而,当我使用id获取数据时,它返回的是字符串x
{
    'id': 1,
    'x': "{\"key\": \"value\"}"
} 

如何正确地将数据反序列化为 JSON?
1个回答

1
你可以在新的序列化器字段中重写to_internal_valueto_representation来处理JSON字段的返回数据。
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

然后,您将在ABCSerializer中使用此字段:

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

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

这应该可以解决你的问题 :)

to_internal_value 函数基本上执行以下操作: 1. 原生值的字典 <- 原始数据类型的字典 2. 在数据验证期间调用 3. 将原始数据类型恢复为其内部 Python 表示形式 如果数据无效,则引发 serializers.ValidationError。 - user8904707
and to_representation则相反: 1. 对象实例 -> 原始数据类型的字典 2. 在调用serializer.data时被调用 3. 将初始数据类型转换为原始可序列化数据类型。 - user8904707
这是指向文档的链接。 - user8904707
你正在使用哪个数据库,以及 DRF 的哪个版本? - PatDuJour
DB=PostgreSQL,DRF=3.7.1 - Praful Bagai
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接