Django ORM: медленный SQL-запрос при использовании обновления со списком идентификаторов
У меня есть некоторые проблемы со скоростью базы данных при выполнении обновления с помощью Django.
Мой запрос выполняется около 15 секунд, обновляя ~1000 строк, что довольно медленно
Вот упрощенная версия моего кода
myList = Model.objects.filter(
...
)[:nb]
myListIds = []
for object in myList:
...
myListIds.append(object.pk)
Model.objects.filter(
pk__in=myListIds
).update(
...
)
Я пытался посмотреть на SQL-запрос, сгенерированный Django, но это ничему меня не научило
Что я делаю не так?
В вашем коде вы фильтруете набор запросов, вставляете идентификаторы в список и фильтруете новый набор запросов с теми же идентификаторами. Я думаю, что вы можете просто сделать следующее:
Model.objects.filter(
...
).update(
...
)
Но если вам нужен цикл for и срез, вы можете использовать метод bulk_update()
myList = Model.objects.filter(
...
)[:nb]
objs = []
for object in myList:
...
objs.append(object)
Model.objects.bulk_update(objs)
Примечание: Если вы хотите сократить время выполнения, метод bulk_update() принимает в качестве второго параметра список полей, которые могут быть полезны для вашей цели.