У меня есть 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()
Я оптимизировать вставку в Model2
используя bulk_create
, однако, это все еще крайне медленно из-за get
от Model1
(~ 45sec для вставок 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
S так просто итерация то же самое.
Это сокращает время вставки чтобы Jus более 3 секунды!
там должно быть лучше, чище и ремонтопригодны способ сделать это. Любые предложения? есть ли способ фильтрации/получить (бойко) в результатах запроса кэша Джанго?
EDIT: Изменено d='foo'
к d=obj.d
- навалом получить потребности быть отображаемыми в кортеже она принадлежит в противном случае я не может создать запись model2.
К сожалению, ваше предложение гораздо медленнее, чем делать 'получить()' последовательно. Я остановил его через 3 минуты. Кроме того, как я упоминал в своем редактировании, это могло бы (должно быть?) Работать, если параметры «d» и «e» были постоянными. Поскольку это не так, у меня нет способа сопоставить 'model1_objs' с правильным' obj.d', поскольку запросы БД не гарантируют порядок. – mibm