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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:02:31