Django循环批量更新数据库列异常:仅更新第一条记录
问题分析与解决办法
你遇到的这个问题其实是个很典型的小疏忽——代码里的return语句位置放错啦!
先看你原来的代码片段:
if val is not None: for a in val: Model.objects.filter(id=a[0]).update(value=str(a[1])) return Response({"Success":"Updated"}, status= status.HTTP_202_ACCEPTED) else: return Response({"Error":"Updation Not Required"}, status=status.HTTP_417_EXPECTATION_FAILED)
问题核心就在**return被包含在for循环内部**:第一次循环执行完第一条记录的更新后,直接就返回了响应,函数瞬间终止,后面的[11, 'No']和[12, 'Yes']对应的循环迭代根本没机会运行,自然也就不会更新数据库啦。
修复后的代码
只需要把return移到for循环外面,等所有更新操作都执行完成后再返回响应:
if val is not None: for a in val: Model.objects.filter(id=a[0]).update(value=str(a[1])) # 所有更新完成后再返回响应 return Response({"Success":"Updated"}, status= status.HTTP_202_ACCEPTED) else: return Response({"Error":"Updation Not Required"}, status=status.HTTP_417_EXPECTATION_FAILED)
额外优化建议
如果你的val列表数据量比较大,循环逐个更新的效率会偏低,推荐用Django的批量更新方式来提升性能:
from django.db.models import Case, When, Value, CharField if val is not None: # 构建批量更新的Case-When逻辑 cases = [ When(id=item[0], then=Value(str(item[1]))) for item in val ] # 一次查询完成所有更新 Model.objects.filter(id__in=[item[0] for item in val]).update( value=Case(*cases, output_field=CharField()) ) return Response({"Success":"Updated"}, status= status.HTTP_202_ACCEPTED) else: return Response({"Error":"Updation Not Required"}, status=status.HTTP_417_EXPECTATION_FAILED)
这种方式只需要执行一次数据库查询,比循环逐个更新高效得多,尤其适合数据量大的场景。
内容的提问来源于stack exchange,提问作者Payel Panja
相关产品推荐
相关产品推荐

