我有類似這樣的Django代碼:優化的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
,然而,這仍然是因爲get
從Model1
(〜45秒的痛苦而緩慢爲3k插入)。
我也嘗試添加:
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
...等(雖然也有少得多b
S和c
這麼只是迭代是一樣的。
這減少了插入時間強行超過3秒!
必須有一個更好,更清潔和維護的方式來做到這一點。有什麼建議? 有沒有辦法來過濾/ Django的緩存查詢結果中獲得(瀟灑)?
編輯:更改d='foo'
爲d=obj.d
- 任何批量獲取需要映射到它所屬的元組,否則我不能創建Model2條目。
不幸的是,你的建議是不是做了'得到()'順序慢得多。 3分鐘後我停了下來。另外,正如我在編輯中提到的,如果參數'd'和'e'是常量,這可能(應該)已經工作。由於它們不是,我無法將'model1_objs'映射到正確的'obj.d',因爲數據庫查詢不能保證順序。 – mibm