求助:将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
相关产品推荐
相关产品推荐

