#django #sqlite
Вопрос:
Когда я использую Django с SQLite 3 и пытаюсь удалить много объектов FilmPage.objects.all().delete()
, я иногда сталкиваюсь с ошибкой , в которой говорится
django.db.utils.Ошибка операции: дерево выражений слишком велико (максимальная глубина 1000)
Когда я попытаюсь ограничить количество объектов FilmPage.objects.all()[:999].delete()
, я получу сообщение об ошибке:
Ошибка утверждения: Невозможно изменить порядок запроса после того, как был взят фрагмент.
Как я могу решить эту проблему?
Ответ №1:
Джанго delete()
работает медленно по двум причинам:
- Django должен обеспечивать каскадную функциональность и ссылку на внешний ключ при выполнении метода удаления
- 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