Где в Django реализована логика ON DELETE CASCADE? (Используется PostgreSQL) - PullRequest
9 голосов
/ 16 июля 2011

Мне просто нужно подтверждение моего понимания о реализации Django ON DELETE CASCADE от ваших экспертов по Django.

Согласно официальной документации Django:

Когда Django удаляет объект, по умолчанию он эмулирует поведение ограничения SQL ON DELETE CASCADE - другими словами, любые объекты, имеющие внешние ключи, указывающие на объект, который будет удален, будут удалены вместе с ним.

Означает ли слово "эмулировать" , что логика ON DELETE CASCADE действительно реализована в Django, а не на уровне базы данных?(Я заглянул в свою базу данных, и все таблицы, содержащие внешние ключи, имеют ON DELETE NO ACTION в своих определениях.)

Если мое понимание правильное, есть ли способ, которым я могу переместитьлогика ON DELETE CASCADE от уровня приложения до уровня базы данных?Я больше ищу правильный способ, а не взлом, чтобы сделать это.(Примечание: я использую PostgreSQL в качестве моего бэкэнда.)

Ответы [ 2 ]

7 голосов
/ 23 марта 2015

Если вы спрашиваете, где реализован соответствующий код: вы можете найти его здесь .

Реализация логики CASCADE-DELETE на уровне приложения / ORM имеет смысл, так как это позволяетприложение, чтобы получать информацию, когда происходит удаление (например, сигналы удаления Django для удаленных экземпляров), кроме того, это нормальный способ включить эту функцию в различных типах баз данных.

Если вы беспокоитесь о целостностиваших данных: Django по-прежнему устанавливает ограничения внешнего ключа, если ваша база данных поддерживает это (например, проверьте Postgresql).Поэтому ваша база данных не позволит вам удалить строки, на которые указывает внешний ключ.

Попробуйте сами:

> DELETE FROM accounts_publisher WHERE id=5;
ERROR:  update or delete on table "accounts_publisher" violates foreign key constraint "accounts_publisher_id_411559b18a178e73_fk_accounts_publisher_id" on table "accounts_membership"
DETAIL:  Key (id)=(5) is still referenced from table "accounts_membership".
0 голосов
/ 07 декабря 2013

К вашему сведению, это настраивается с django 1.3: https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ForeignKey.on_delete

Как правило, вам нужно установить on_delete в DO_NOTHING и добавить каскадную логику в БД самостоятельно:

DO_NOTHING: не предпринимать никаких действий. Если ваша база данных обеспечивает ссылочную целостность, это вызовет IntegrityError, если вы вручную не добавите ограничение SQL ON DELETE в поле базы данных (возможно, с использованием исходного sql).

...