You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用$.ajax正确发送嵌套对象?(Django+jQuery环境)

解决jQuery $.ajax发送嵌套对象被扁平化的问题

问题根源

FormData本质是键值对集合,无法直接存储嵌套对象;jQuery默认会将对象序列化为表单提交的键值对格式(如data_origin[manual][0][comment]),而非JSON嵌套结构。你控制台看到的"正确嵌套结构"其实是你构建的原始对象,并非FormData中实际存储的内容。

解决方案

根据是否需要上传文件,分两种情况处理:

情况1:需要上传文件(必须用FormData)

将嵌套对象转为JSON字符串,作为FormData的一个字段发送,后端再解析这个字符串:

前端代码

// 构建嵌套对象
const dataOrigin = {
  manual: [
    { comment: "测试评论" }
    // 其他嵌套内容
  ]
};

const formData = new FormData();
// 把嵌套对象转为JSON字符串存入FormData
formData.append('data_origin', JSON.stringify(dataOrigin));
// 追加其他表单字段或文件
// formData.append('file', document.getElementById('file-input').files[0]);

$.ajax({
  url: '/你的接口路径/',
  method: 'POST',
  data: formData,
  processData: false, // 禁用jQuery对数据的自动处理,必须设置
  contentType: false, // 让浏览器自动设置正确的Content-Type,必须设置
  success: res => console.log(res),
  error: xhr => console.error(xhr.responseText)
});

Django后端代码

import json
from django.http import JsonResponse

def your_view(request):
    if request.method == 'POST':
        data_origin_str = request.POST.get('data_origin')
        if not data_origin_str:
            return JsonResponse({'error': '缺少data_origin字段'}, status=400)
        
        try:
            data_origin = json.loads(data_origin_str)
            # 这里可以处理嵌套结构的数据了
            print(data_origin['manual'][0]['comment']) # 输出:测试评论
            return JsonResponse({'status': 'success'})
        except json.JSONDecodeError:
            return JsonResponse({'error': 'data_origin格式错误'}, status=400)

情况2:不需要上传文件(无需用FormData)

直接发送JSON格式的请求体,更简洁高效:

前端代码

const postData = {
  // 其他普通字段
  username: 'test_user',
  // 嵌套对象
  data_origin: {
    manual: [
      { comment: "测试评论" }
    ]
  }
};

$.ajax({
  url: '/你的接口路径/',
  method: 'POST',
  data: JSON.stringify(postData),
  contentType: 'application/json', // 明确告诉后端是JSON格式
  success: res => console.log(res),
  error: xhr => console.error(xhr.responseText)
});

Django后端代码

import json
from django.http import JsonResponse

def your_view(request):
    if request.method == 'POST':
        try:
            post_data = json.loads(request.body)
            data_origin = post_data.get('data_origin')
            # 处理嵌套数据
            print(data_origin['manual'][0]['comment']) # 输出:测试评论
            return JsonResponse({'status': 'success'})
        except json.JSONDecodeError:
            return JsonResponse({'error': '请求体格式错误'}, status=400)

内容的提问来源于stack exchange,提问作者Eric Luther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:05:26