加速Django中批量ORM操作的策略

9 投票
2 回答
3689 浏览
提问于 2025-04-11 19:12

我有一个API调用,它可能会更新很多对象(Django模型)。因为我一个一个地更新每个项目,保存后再处理下一个,所以我遇到了性能问题。

for item in Something.objects.filter(x='y'):
    item.a="something"
    item.save()

有时候,我的筛选条件看起来像是“where x in ('a','b','c',...)”。

官方的回答是“不会修复这个问题”。我在想大家都用什么方法来提高这种情况下的性能。

2 个回答

1

你需要使用事务,或者手动编写SQL语句。你也可以尝试使用SQLAlchemy,它支持一些很棒的ORM功能,比如工作单元(或者说应用事务)。

Django的事务相关内容可以查看这里:http://docs.djangoproject.com/en/dev/topics/db/transactions/?from=olddocs

SQLAlchemy的官方网站在这里:http://www.sqlalchemy.org/

15

你链接的那个票据是关于批量创建的。如果你没有依赖于重写的 save 方法或者在保存时触发的前后信号来处理一些工作,QuerySet 有一个 update 方法,你可以用它来对筛选出来的行进行 UPDATE 操作:

Something.objects.filter(x__in=['a', 'b', 'c']).update(a='something')

撰写回答