【问题标题】:Django - Deserializing JSONField in DRFDjango - 在 DRF 中反序列化 JSONField
【发布时间】:2018-04-23 10:59:51
【问题描述】:

我在模型中有一个 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 获取数据时,它返回 xstr,即

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

如何正确地将数据反序列化回 json?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案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_valueto_representation 是什么?你能帮我准备一份合适的文件吗?
    • to_internal_value 函数几乎做了以下事情: 1. 本机值的字典
    • 而 to_representation 则相反: 1. 对象实例 -> 原始数据类型的字典 2. 在调用 serializer.data 时调用 3. 将初始数据类型转换为原始的、可序列化的数据类型 """
    • 这里是doc的链接
    • 为什么我不能使用 JSONField 代替? django-rest-framework.org/api-guide/fields/#jsonfield
    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 2017-03-30
    • 2016-08-17
    • 1970-01-01
    • 2015-09-14
    • 2018-08-30
    • 1970-01-01
    • 2020-01-02
    相关资源
    最近更新 更多