如何遍历JSON payload元素 解决QId/Answer仅插入最后一条问题
问题现象
需要将传入payload中QId、Answer字段对应的所有记录插入数据库,现有编写的遍历逻辑仅能成功插入最后一条数据,无法实现所有QId、Answer值的完整入库。
原有问题代码(views.py)
cursor = connection.cursor() for ran in request.data: print('request.data--', ran) auditorid =ran.get('AuditorId') print('SaveUserResponse auditorid---', auditorid) ticketid = ran.get('TicketId') qid = ran.get('QId') answer = ran.get('Answer') sid = '0' print('sid--', sid) for i in request.data: qid = i['QId'] print('qid--', qid) answer = i['Answer'] print('answer--', answer) cursor.execute('EXEC [dbo].[sp_SaveAuditResponse] @auditorid=%s,@ticketid=%s,@qid=%s,@answer=%s,@sid=%s', (auditorid,ticketid,qid,answer, sid)) print(qid) result_st = cursor.fetchall() print('sp_SaveAuditResponse', result_st) for row in result_st: print('sp_SaveAuditResponse', row) return Response(row[0])
传入Payload示例
[ {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":42,"Answer":"2","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":43,"Answer":"2","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":44,"Answer":"2","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":45,"Answer":"2","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":46,"Answer":"3","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":47,"Answer":"5","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":48,"Answer":"5","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":49,"Answer":"2","SID":"0","Comments":""}, {"AuditorId":130,"Agents":"","Supervisor":"","TicketId":"325423432","QId":50,"Answer":"5","SID":"0","Comments":""} ]
问题根因
- 冗余嵌套循环:外层遍历请求数据的逻辑中,额外嵌套了一层全量遍历请求数据的内层循环,每次外层循环执行时,内层循环都会反复覆盖
qid、answer变量,最终两个变量只会保留内层循环遍历到的最后一条记录的值 - 执行语句位置错误:数据库插入执行语句
cursor.execute写在所有循环的外部,全部遍历流程结束后才会执行一次插入操作,仅能拿到最后被覆盖的变量值 - 返回逻辑位置错误:接口响应返回语句
return Response写在循环流程内,即便调整执行语句位置,第一次插入完成后就会直接返回响应,中断后续所有插入操作
修正后可运行代码
from django.db import connection from rest_framework.response import Response cursor = connection.cursor() success_count = 0 total = len(request.data) try: # 单层遍历即可,不需要嵌套循环 for record in request.data: auditorid = record.get('AuditorId') ticketid = record.get('TicketId') qid = record.get('QId') answer = record.get('Answer') # 优先从传入参数取SID,无值时默认给'0' sid = record.get('SID', '0') # 插入语句放在循环内部,每条记录执行一次存储过程 cursor.execute( 'EXEC [dbo].[sp_SaveAuditResponse] @auditorid=%s,@ticketid=%s,@qid=%s,@answer=%s,@sid=%s', (auditorid, ticketid, qid, answer, sid) ) # 取存储过程返回结果 insert_result = cursor.fetchone() if insert_result[0] == 1: success_count += 1 # 所有记录遍历插入完成后再统一返回结果 return Response({ "code": 200, "msg": "操作完成", "total": total, "success_count": success_count }) except Exception as e: return Response({ "code": 500, "msg": f"插入异常:{str(e)}", "success_count": success_count }) finally: # 关闭游标释放连接 cursor.close()
修正点说明
- 删除冗余的内层嵌套循环,单次遍历直接读取当前记录的字段值,避免变量被无意义覆盖
- 将存储过程执行逻辑移到单层循环内部,每遍历到一条记录就执行一次插入
- 将接口返回逻辑移到所有循环流程外部,保证所有记录都能被遍历处理
- 新增异常捕获和成功计数逻辑,方便定位插入过程中的错误,返回信息更清晰
- 调整SID赋值逻辑,优先读取传入payload中的SID值,兼容参数异常场景
- 新增游标关闭逻辑,避免数据库连接泄漏
内容的提问来源于stack exchange,提问作者kelvin003
相关产品推荐
相关产品推荐

