讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

Seko
Seko

AI短剧一键生成成片

如何在Python的Django中优雅处理前端传递的复杂嵌套JSON数据

梦涛小哥_1522

梦涛小哥_1522

发布时间:2026-11-10 10:48:22

|

811人浏览过

|

来源于php中文网

原创

Django接收嵌套JSON需手动解析request.body并校验,推荐用DRF Serializer处理多层嵌套;解析前应限制深度防递归,保存时须拆解嵌套数据再分别创建模型实例。

如何在python的django中优雅处理前端传递的复杂嵌套json数据

接收嵌套JSON时request.body为空或报错

前端用 fetch 或 axios 发送 Content-Type: application/json 请求时,Django 默认不自动解析 request.body。直接读 request.POST 会是空的,因为 POST 只处理表单编码(application/x-www-form-urlencoded 或 multipart/form-data)。

正确做法是手动解析原始 body:

import json
<p>def my_view(request):
if request.method == 'POST':
try:
data = json.loads(request.body.decode('utf-8'))
except json.JSONDecodeError:
return JsonResponse({'error': 'Invalid JSON'}, status=400)</p>

注意点:

  • request.body 是 bytes,必须用 .decode('utf-8') 转成字符串再解析
  • 别用 request.POST.get('xxx')——它对 JSON 请求完全无效
  • 生产环境建议加 if not request.content_type == 'application/json' 做类型校验

用Django REST Framework的Serializer校验嵌套结构

手写 json.loads + 手动字段校验容易漏边界、难复用。DRF 的 Serializer 是更健壮的选择,尤其对多层嵌套(如 {'user': {'profile': {'tags': ['a','b']}}})。

立即学习“Python免费学习笔记(深入)”;

示例:定义支持三级嵌套的序列化器

from rest_framework import serializers
<p>class TagSerializer(serializers.Serializer):
name = serializers.CharField(max_length=20)</p><p>class ProfileSerializer(serializers.Serializer):
nickname = serializers.CharField(required=False)
tags = TagSerializer(many=True, required=False)</p><p>class UserSerializer(serializers.Serializer):
email = serializers.EmailField()
profile = ProfileSerializer(required=False)</p>

在视图中使用:

HISUI 前端框架开发指南(IRIS版)
HISUI 前端框架开发指南(IRIS版)

HISUI 前端框架基础开发指南。HISUI 是基于 easyui 二次开发的 jQuery UI 组件库,专为医疗信息系统设计。当涉及 HISUI 组件开发、jQuery easyui 表格/表单/布局/窗口、医疗系统前端页面编写时使用此 skill。 涵盖 40 个组件的官方文档参考,支持声明式与编程式两种初始化方式,提供 $cm/$m 数据访问方法。

下载
serializer = UserSerializer(data=data)
if serializer.is_valid():
    validated_data = serializer.validated_data  # 已清洗、类型转换、嵌套展开
else:
    return Response(serializer.errors, status=400)

关键细节:

  • many=True 用于列表字段,否则嵌套数组会校验失败
  • 嵌套 Serializer 默认要求非空;加 required=False 才允许字段缺失
  • validated_data 是字典,不是模型实例——适合纯数据处理场景

避免递归嵌套导致的无限循环或性能崩塌

前端可能传入意外的深层嵌套(比如 10 层嵌套对象),或故意构造循环引用({"a": {"b": {...}}} 中 b 指回 a)。DRF 默认不检测循环,json.loads 会直接报 RecursionError 或卡死。

防御措施:

  • 在解析前限制嵌套深度:json.loads(request.body, parse_constant=lambda x: _raise_on_deep(x, max_depth=5))(需自定义钩子)
  • 更简单:用 json.loads 的 object_hook 统计层级,超限时抛异常
  • DRF 中可在 to_internal_value 方法里加深度检查,例如 len(str(data)) > 1024*100 快速拦截超大 payload
  • Nginx 层加 client_max_body_size 2m; 防止巨量 JSON 打满内存

保存嵌套数据到Django模型时的常见陷阱

拿到校验后的 validated_data 后,不能直接 User.objects.create(**validated_data)——因为 profile 是字典,不是 Profile 实例,Django 会报 Object of type dict is not JSON serializable 或字段不匹配。

正确拆解方式:

# 先 pop 出嵌套部分
profile_data = validated_data.pop('profile', None)
user = User.objects.create(**validated_data)
<p>if profile_data:
Profile.objects.create(user=user, **profile_data)</p>

注意点:

  • 用 .pop() 而非 .get(),避免把嵌套 dict 当作字段传给 create()
  • 外键关联(如 user=user)必须显式传入,不能靠字段名自动推导
  • 如果嵌套中含多对一关系(如多个 Tag),需循环创建并关联,不能用 ** 解包

嵌套层级越深,手动拆解越容易出错;复杂业务建议封装成 save_nested() 工具函数,但别过度抽象——多数项目两层嵌套已足够。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2923

2023.08.11

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

6403

2023.10.09

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

7290

2024.03.19

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

7138

2024.03.22

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

1023

2024.05.22

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1891

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

5264

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1849

2023.07.31

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn