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

求助:将multipart/form-data格式数据转为嵌套结构QueryDict对象

解决方案:解析嵌套格式的表单数据

如果你用的是Django框架,自带的QueryDict其实就支持这种嵌套结构的解析——更省心的是,当处理multipart/form-data类型的请求时,Django的request.POST(处理非文件字段)和request.FILES已经自动帮你把表单数据解析成嵌套结构了,不用手动处理扁平字典。

如果是你手里已经有了扁平格式的字典,想要转换成嵌套结构,有几种可行的方式:

1. 用第三方库 python-multipart

这个库专门用来解析multipart/form-data和URL编码的嵌套数据,用法简单:

首先安装:

pip install python-multipart

然后解析你的扁平数据:

import urllib.parse
from multipart import parse_form_data

# 你的扁平数据
flat_data = {
    'name': 'erhan',
    'last_name': 'koçlar',
    'gender.code': 1,
    'gender1.gender2.gender3.gender4.code': 1,
    'tags[5]': 'TAG_2',
    'tags[0]': 'TAG_1',
    'tags[1]': 'TAG_2',
    'persons[0].name': 'erhan',
    'persons[1].name': 'ercan',
    'files[0].file': 'file1',
    'files[0].name': 'file_name_1',
    'section_files[0]': 'file2',
    'rows[0][0]': 'col_1',
    'rows[0][1]': 'col_2',
    'rows[1][0]': 'row_1',
    'rows[1][1]': 'row_2'
}

# 把扁平字典转成URL编码格式
encoded_data = urllib.parse.urlencode(flat_data, doseq=True)
# 解析成嵌套结构
_, nested_data = parse_form_data(encoded_data.encode('utf-8'))

print(nested_data)

2. 自己实现解析函数

如果不想依赖第三方库,也可以自己写一个函数处理点分隔的嵌套键和括号数组索引:

def parse_nested_flat_data(flat_data):
    result = {}
    for key, value in flat_data.items():
        current = result
        # 先按点拆分键的层级
        key_segments = key.split('.')
        
        for segment in key_segments[:-1]:
            # 处理数组索引,比如 "tags[0]" 或 "rows[0]"
            if '[' in segment and ']' in segment:
                arr_name, idx_str = segment.split('[', 1)
                idx = int(idx_str.rstrip(']'))
                # 初始化数组,保证长度足够容纳索引
                if arr_name not in current:
                    current[arr_name] = []
                while len(current[arr_name]) <= idx:
                    current[arr_name].append({})
                current = current[arr_name][idx]
            else:
                # 普通字典层级
                if segment not in current:
                    current[segment] = {}
                current = current[segment]
        
        # 处理最后一个键段
        last_segment = key_segments[-1]
        if '[' in last_segment and ']' in last_segment:
            arr_name, idx_str = last_segment.split('[', 1)
            idx = int(idx_str.rstrip(']'))
            if arr_name not in current:
                current[arr_name] = []
            # 扩展数组到对应长度
            while len(current[arr_name]) <= idx:
                current[arr_name].append(None)
            current[arr_name][idx] = value
        else:
            current[last_segment] = value
    return result

# 使用示例
nested_data = parse_nested_flat_data(flat_data)
print(nested_data)

这个函数能完美处理你给出的所有场景:多层嵌套字典、带索引的数组、二维数组等,输出结果和你预期的完全一致。

3. Django项目中的简化处理

如果是在Django里接收multipart/form-data请求,直接用request.POST.getlist()或者直接访问嵌套键就行,比如:

# 访问嵌套字典
gender_code = request.POST['gender.code']
# 访问数组
tags = request.POST.getlist('tags[]')
# 访问嵌套数组对象
person0_name = request.POST['persons[0].name']

如果要转换成完整的嵌套字典,可以用上面的第三方库或自定义函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 22:10:28