#django #django-models
#django #django-модели
Вопрос:
В существующем проекте Django я испытываю критические проблемы с производительностью при удалении объектов определенной модели. На самом деле вся инфраструктура ломается.
Мне нравится, что это вызвано полем внешнего ключа для другой модели со многими и большими записями.
После нескольких часов поиска в Google я нашел возможное решение: реализация ограничений при удалении на уровне базы данных.
Я также нашел продолжительное обсуждение в Django PR https://github.com/django/django/pull/8661 что позволило бы включить эту функцию. Но мне кажется, что он никогда не достигал 100% и не будет объединен в ближайшем будущем.
Другой способ решить мою проблему упоминается в документах Django https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models .DO_NOTHING
DO_NOTHING
Не предпринимайте никаких действий. Если серверная часть вашей базы данных обеспечивает ссылочную целостность, это вызовет ошибку IntegrityError, если вы вручную не добавите ограничение SQL ПРИ удалении в поле базы данных.
Я использую MariaDB. И я хочу добавить ограничение SET_NULL только к одному полю внешнего ключа одной модели на уровне базы данных.
Как я могу это сделать в Django? Я прекрасно могу жить с жестко закодированными уродливыми решениями, если они решают мою проблему и не вводят новые.
Комментарии:
1. Таким образом, вы могли бы использовать DO_NOTHING на уровне Django и SET_NULL на уровне базы данных docs.djangoproject.com/en/3.1/howto/writing-migrations , обратите внимание, что это не удаляет связанные экземпляры, а просто устанавливает отношение к NULL
2. Да, в моем конкретном случае я хочу сохранить связанные экземпляры. Проверяя вашу ссылку, которую я нашел
migrations.RunSQL
. Это выглядит очень хорошо и отвечает на мой вопрос, как практически добавить это ограничение. Поскольку я не знаю SQL, единственный оставшийся вопрос, как должен выглядеть код SQL. Но я думаю, что на это уже где-то ответили.