如何解析Python嵌套dict对象提取字段并将数据写入数据库
核心问题定位
- 直接遍历Python字典默认返回键而非值:你写
for group in dictForm时,拿到的group是'0'、'1'、'2'这类字符串键,不是分组对应的实际字典对象,所以后续group[str(iteration)]的写法完全错误。 - 遍历
Inputs时同样只拿到键:你写for input in group[str(iteration)]['Inputs']时,拿到的input是Inputs下的字符串键(比如示例里的'0'),不是包含DataName、DataType的子字典,直接取值必然报错。
正确解析逻辑
你的目标字典是两层嵌套结构,取值逻辑如下:
- 按数字顺序遍历外层字典的所有键,拿到每个分组对应的字典,从中取出
Group Name字段 - 对每个分组,遍历其
Inputs下的所有键,拿到每个输入项对应的字典,从中取出DataName和DataType字段
修正后的入库代码
假设icformkey的顺序是「所有level=0的分组在前,所有level=1的输入项在后」,和遍历顺序逐个对应,代码如下:
iteration = 0 # 先将外层字典的键转为整数排序,保证遍历顺序和键的数字顺序一致 for group_key in sorted(dictForm.keys(), key=lambda x: int(x)): group_data = dictForm[group_key] # 处理分组(level=0) if icformkey[iteration].level == 0: SingleQuery = icformkey[iteration] SingleQuery.name = group_data['Group Name'] SingleQuery.full_clean() SingleQuery.save() iteration += 1 # 处理该分组下的所有输入项(level=1) for input_key in sorted(group_data['Inputs'].keys(), key=lambda x: int(x)): input_data = group_data['Inputs'][input_key] if icformkey[iteration].level == 1: SingleQuery = icformkey[iteration] SingleQuery.name = input_data['DataName'] SingleQuery.datatype = input_data['DataType'] SingleQuery.full_clean() SingleQuery.save() iteration += 1 output = {'result': True, 'error': 0} return JsonResponse(output, safe=False)
补充说明
如果icformkey的存储顺序和遍历顺序不匹配,可以先把解析出来的所有数据存到一个列表里,再批量更新queryset,避免索引错位问题。
内容的提问来源于stack exchange,提问作者nogabemist
相关产品推荐
相关产品推荐

