Django-Rest框架:自定义JSON Serializ

2024-06-16 09:48:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力找出如何在DRF中编写自定义序列化程序来解析传递给端点的复杂JSON数据结构。JSON如下所示:

{
    "name": "new",
    "site": "US",
    "data": {
        "settings": [],
        "meta": {
            "meta1":{}
        }
    }
}

这是我的后端代码:

^{pr2}$

但是data总是返回None。仔细观察request对象,传入的JSON如下所示:

# POST attribute of request object
'name' = 'new'
'site' = 'US'
'data[settings][0] = ''
'data[meta][meta1][] = ''

基本上,与data键相关联的嵌套JSON对象没有正确序列化为Pythondict和{}对象。我一直在寻找自定义DRF序列化程序的示例,但我发现的大多数示例都是用于序列化Django模型的,但我不需要这样做。传入的数据不会直接映射到我的模型;相反,我需要在保存任何数据之前进行一些处理。在

有没有人对自定义序列化程序有什么建议,可以将dataJSON正确地转换为适当的Python对象?我从这个开始,但是它抛出了一个异常(When a serializer is passed a 'data' keyword argument you must call '.is_valid()' before attempting to access the serialized '.data' representation. You should either call '.is_valid()' first, or access '.initial_data' instead.)。以下是我创建的自定义序列化程序的代码:

# serializers.py
class SaveDataSerializer(serializers.Serializer):
    name = serializers.CharField()
    site = serializers.CharField()
    data = serializers.DictField()

    def create(self, validated_data):
        return dict(**validated_data)

谢谢。在


Tags: 对象name程序jsonnewdata序列化settings
1条回答
网友
1楼 · 发布于 2024-06-16 09:48:53

我通过将JS对象传递给$.ajax时将其转换为JSON来解决我的问题,然后DRF能够正确地解析成Python对象。下面是我使用的jQuery的一个片段:

$.ajax({
    url: '/api/endpoint',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(ajaxData),
    done: function(data) {}
    ...
})

请注意,如果不指定任何内容,jQuery将默认为x-www-urlencoded作为Content-Type。由于我使用JSON.stringify()方法显式地将ajaxData对象转换为JSON字符串,因此Content-Type也需要显式设置。在

我从这个得到了答案:Convert Object to JSON string

当然,这并不能真正回答我最初的问题,但这是另一个更简单的解决方案,它可以像我想要的那样工作。通过这样做,我不必创建任何自定义序列化程序,但我必须修改我的API视图,如下所示:

^{pr2}$

完成此操作后,将返回预期的对象类型

>>> type(name)
str
>>> type(site)
str
>>> type(data)
dict

相关问题 更多 >