django-rest-framework的JSONField字段,数据库字段保存json对象方案

有个业务场景,数据库一个字段保存json数据,访问时返回该json。

这里使用modle字段为 

name = models.CharField(max_length=120)

序列化器

name = serializers.JSONField()

但是DRF 框架的JSONField 字段 返回的是符串,并且保存到数据库中的数据的转成了python的数据格式,如字典的键是用单引号引出,但是json是用双引号引出,单引号引出的不是json格式,无论前端还是后端解释都是解释不出来的。所以在这里我们需要改写下JSONField 这个字段。

class Jsonserializer(serializers.JSONField):
    default_error_messages = {
        'invalid_json': _('无效的json数据格式')
    }
    def to_representation(self, value):
        return json.loads(value)

    def to_internal_value(self, data):
        try:
            json.loads(data)
        except (TypeError, ValueError):
            self.fail('invalid_json')
        return data

这里我们 将前端传来的数据 校验后(json.loads(data)) 保存原数据data.

序列化时将读出的数据转成Python 可序列化格式,即原json对应的Python数据格式(json.loads(value))。

将序列化器改为

class testjson(serializers.ModelSerializer):
    name = Jsonserializer()
   

    class Meta:
        model=TestModel
        fields = '__all__'

即可,前端传入的为json,返回时也是json,不会出现转义或返回的是一串字符串。

以下为想要的格式

  {
        "id": 7,
        "name": {
            "name": "huahzong"
        }
    }

错误数据 ,出现了转义

{
        "id": 7,
        "name": "{\"name\":\"huahzong\"}"
    },

错误格式 ,返回为字符串,且数据非json格式,单引号。这种格式前端解释不出来,为JSONField 字段的返回。

{
        "id": 17,
        "name": "{'name': 'huazhong'}"
    }

 

你可能感兴趣的:(Django,python3,数据库,后端)