【问题标题】:Override JsonField Django REST framework覆盖 JsonField Django REST 框架
【发布时间】:2018-08-02 12:11:46
【问题描述】:

我在我的序列化程序中使用了 JSONfield,正如线程 store json as dict 中的用户指出的那样,带有 Mysql 的 DRF 将 JSONfield 存储为字典

但是,我宁愿将其存储为 JSON {"tags":{"data":"test"}} 而不是将其存储为 Dict 的默认行为 - {'tags': { 'data': 'test' }} - Daniel 建议使用覆盖 JSONfield 为:

class JSONField(serializers.Field):
 def to_representation(self, obj):
  return json.loads(obj)
......

但是数据仍然存储为字典。 在我的 serializers.py 我已经覆盖了 JSONField 类,然后就这样使用它

class schemaserializer(serializers.ModelSerializer):
   js_data=serializers.JSONField()

但它仍将其保存为字典。 预期行为: 将其保存为 JSON - POST

将其检索为 dict - GET(以便渲染器可以将其解析为 JSON)

目前我正在使用 json 转储和 json 加载手动执行此操作,但正在寻找更好的方法。

这样做的原因是,虽然我有一个 API,但在某些情况下,用户会直接读取我的数据库,并且他们需要该字段为 JSON。

Django (2.0.1) 蟒蛇 3.5 djangorestframework (3.7.7)

【问题讨论】:

    标签: json django dictionary django-rest-framework


    【解决方案1】:

    你的意思是你想在你的数据库后端使用实际的 JSON 类型吗?如果是这样,您可能希望在模型上使用适当的 JSONfield 类型,而不是专门在序列化程序中。

    【讨论】:

    • 感谢您的回复。你是对的,我确实想将数据存储为实际的 JSON,但是我不能将字段类型更改为 JSON,它不受我的控制。我必须想办法使用序列化程序来做到这一点。正如我提到的,我可以手动完成,但这不是干净的代码,正在寻找更好的方法。
    【解决方案2】:

    序列化器允许将复杂数据(例如查询集和模型实例)转换为原生 Python 数据类型,然后可以轻松地将其呈现为 JSON、XML 或其他内容类型。

    serializers docs查看更多信息

    你需要的是:

    class SchemaSerializer(serializers.ModelSerializer):
        class Meta:
            model = YOUR_MODEL_NAME
            fields = A_LIST_OF_FIELD
    

    然后在你看来:

    class SchemaView(mixins.ListModelMixin, generic.GenericAPIView):
        queryset = YOUR_MODEL_NAME.objects.all()
        serializer_class = SchemaSerializer
    

    【讨论】:

    • 您好,谢谢您的回复。但我已经在这样做了。 DRF 将 JSON 存储为 Dict,并在响应 API 时将 Dict 解析为 JSON,正如预期的那样。但是,我也有直接从数据库读取数据的用户,他们需要将数据存储为 JSON。因此,我需要一种将数据存储为 JSON 的方法,并在响应 API 时将数据解析为 dict 并将其发送到 Response() obj 以转换为 JSON。我目前正在使用 json 转储和加载手动执行此操作,正在寻找更好的方法。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2016-08-09
    • 2016-05-27
    • 2017-09-23
    相关资源
    最近更新 更多