Django's models.CASCADE в базе данных Postgres с помощью db_constraint
Очевидно, что когда я пытаюсь удалить родительский объект, специально возникает ошибка целостности e
IntegrityError at /admin/app/parent/(attempted to delete the parent object from admin & later shell)
update or delete on table "app_parent" violates foreign key constraint "app_child_model_id_724b75c4_fk_app_parent_id" on table "app_child" DETAIL: Key (id)=(2) is still referenced from table "app_child"
После гугления и некоторых ответов на stackoverflow я решил заменить models.CASCADE на models.DO_NOTHING. Один раз удаление сработало хорошо, но позже я столкнулся с той же ошибкой.
Мой код просто базовый
class Parent(models.Model):
pass
class Child(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
И я увидел эту страницу документации по postgres
https://docs.djangoproject.com/en/3.2/ref/contrib/postgres/constraints/
Я не могу полностью понять технические аспекты. Было бы неплохо, если бы кто-нибудь объяснил и, возможно, продемонстрировал правильную работу кода, скажем, с моделью с именем Parent и моделью с именем Child, содержащей поле внешнего ключа для Parent, конкретно для Postgres. Я плохо разбираюсь в БД, поэтому мне нужна ваша помощь.
Спасибо!!!
Редактирование: Да. Я запустил свои миграции. И проверяя отношения в оболочке psql, я вижу ограничения foreignkey, существующие на уровне db_level. Что-то вроде
"app_child_parent_id_724b75c4_fk_app_parent_id" FOREIGN KEY (parent_id) REFERENCES app_parent(id) DEFERRABLE INITIALLY DEFERRED
Как мне преодолеть этот конфликт между Django и Postgres?
В документации Django по SQL, на которую я ссылался выше, также говорится, что "Если вы пытаетесь вставить новый ряд, который конфликтует с существующим рядом, возникает ошибка IntegrityError. Аналогично, если обновление конфликтует с существующим рядом."
Но я не понимаю, как использовать атрибут ограничения в мета-опциях модели?
Также, что если я установлю db_constraint = False ?