如何使用字典列表更新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
相关产品推荐
相关产品推荐

