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

如何遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:15:41