【发布时间】:2016-07-15 12:31:04
【问题描述】:
我有类似这样的 Django 代码:
for obj in some_list:
m1obj = Model1.objects.get(a=obj.a, b=obj.b, c=obj.c)
Model2(m1=m1obj, d=obj.d, e='foo').save()
我确实使用 bulk_create 优化了对 Model2 的插入,但是,由于来自 Model1 的 get,这仍然非常缓慢(对于 3k 插入,~45sec)。
我也尝试添加:
class Meta:
index_together = [
('a', 'b', 'c'),
]
unique_together = [
('a', 'b', 'c'),
]
unique_together 有点帮助,index_together 似乎没有太大作用。
我有一个麻烦的解决方法:
- 过滤
Model1获取我需要的所有对象,按一个或多个键排序,例如order_by('a', 'b'),并确保 Django 缓存结果,例如len() - 使用二分搜索 (
from bisect import bisect_left) 来定位第一个a,然后是b... 等等(虽然bs 和cs 的数量要少得多,所以只是迭代是一样的。李>
这将插入时间缩短到3秒!
必须有更好、更清洁和可维护的方法来做到这一点。有什么建议? 有没有办法在 Django 的缓存查询结果中过滤/获取(智能)?
编辑:将 d='foo' 更改为 d=obj.d - 任何批量获取都需要映射到它所属的元组,否则我无法创建 Model2 条目。
【问题讨论】:
标签: django django-models query-optimization