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

如何使用字典列表更新Django数据库中的现有记录?

批量更新Django数据库记录的实用方案

你手里有一组包含主键id和对应状态的键值对列表,需要更新Django模型bug中对应记录的status字段,下面是两种可行的实现方式:

方法一:用bulk_update批量操作(推荐,效率高)

Django 2.2及以上版本支持bulk_update,能一次性批量更新多条记录,数据量大的时候优势明显。

代码示例:

from your_app.models import bug

stat = [{'id': 1, 'status': 'Not Fixed'}, {'id': 2, 'status': 'Not Fixed'}, {'id': 4, 'status': 'Not Fixed'}, {'id': 5, 'status': 'Not Fixed'}, {'id': 6, 'status': 'Not Fixed'}, {'id': 7, 'status': 'Not Fixed'}]

# 提取所有要更新的id
target_ids = [item['id'] for item in stat]
# 获取对应的bug实例
bugs_to_update = bug.objects.filter(id__in=target_ids)

# 把id和status做成映射字典,方便快速匹配
status_map = {item['id']: item['status'] for item in stat}

# 给每个实例设置新状态
for bug_instance in bugs_to_update:
    bug_instance.status = status_map[bug_instance.id]

# 执行批量更新,指定要更新的字段是status
bug.objects.bulk_update(bugs_to_update, ['status'])

注意:

  • 要确保'Not Fixed'是status_choice里定义的合法值,不然会触发验证报错
  • bulk_update不会触发模型的save()方法,如果你的save()里有自定义逻辑,得额外处理

方法二:循环单条更新(适合小数据量)

如果数据量不大,也可以直接循环列表,逐个更新记录:

from your_app.models import bug

stat = [{'id': 1, 'status': 'Not Fixed'}, {'id': 2, 'status': 'Not Fixed'}, {'id': 4, 'status': 'Not Fixed'}, {'id': 5, 'status': 'Not Fixed'}, {'id': 6, 'status': 'Not Fixed'}, {'id': 7, 'status': 'Not Fixed'}]

for item in stat:
    bug.objects.filter(id=item['id']).update(status=item['status'])

这种方法每次循环都会发一次数据库请求,数据多的时候效率低,但逻辑简单,而且会触发字段的验证逻辑。

内容的提问来源于stack exchange,提问作者Jin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:05:42