Как добавить вручную при удалении ограничений SQL в Django?

#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. Но я думаю, что на это уже где-то ответили.

3. mariadb.com/kb/en/foreign-keys/#syntax