加速Django中批量ORM操作的策略
我有一个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')