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() принимает в качестве второго параметра список полей, которые могут быть полезны для вашей цели.

Вернуться на верх