Массовое удаление объектов в Django с помощью SQLite

#django #sqlite

Вопрос:

Когда я использую Django с SQLite 3 и пытаюсь удалить много объектов FilmPage.objects.all().delete() , я иногда сталкиваюсь с ошибкой , в которой говорится

django.db.utils.Ошибка операции: дерево выражений слишком велико (максимальная глубина 1000)

Когда я попытаюсь ограничить количество объектов FilmPage.objects.all()[:999].delete() , я получу сообщение об ошибке:

Ошибка утверждения: Невозможно изменить порядок запроса после того, как был взят фрагмент.

Как я могу решить эту проблему?

Ответ №1:

Джанго delete() работает медленно по двум причинам:

  1. Django должен обеспечивать каскадную функциональность и ссылку на внешний ключ при выполнении метода удаления
  2. Django должен решать signals связанные с этим вопросы, такие как post_save и pre_save

Поскольку вы знаете, что ваши модели каскадируют, сигнализируют и все отношения внешнего ключа, вы можете использовать _raw_delete API для массового удаления.

Подобный этому:

 queryset._raw_delete(queryset.db)
 

Более подробную информацию можно найти здесь: https://docs.djangoproject.com/en/3.2/topics/db/queries/#deleting-objects

Также ознакомьтесь с этим билетом, касающимся массового удаления: https://code.djangoproject.com/ticket/9519