В django, как удалить все связанные объекты при удалении экземпляров определенного типа? - PullRequest
2 голосов
/ 04 августа 2011

Сначала я попытался переопределить метод delete (), но это не работает для метода массового удаления QuerySet.Это должно быть связано с сигналом pre_delete, но я не могу понять это.Мой код выглядит следующим образом:

def _pre_delete_problem(sender, instance, **kwargs):
    instance.context.delete()
    instance.stat.delete()

Но этот метод, кажется, вызывается бесконечно, и программа запускается в тупик.Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

7 голосов
/ 04 августа 2011

Если у класса есть внешние ключи (или связанные объекты), они по умолчанию удаляются как DELETE CASCADE в sql.

Вы можете изменить поведение, используя аргумент on_delete при определении ForeignKey в классе, но по умолчанию это CASCADE. Вы можете проверить документы здесь .

Теперь сигнал pre_delete работает, но он не вызывает метод delete(), если вы используете массовое удаление, поскольку он не удаляется в объекте по объектам.

1 голос
/ 22 мая 2012

В вашем случае использование сигнала post_delete вместо pre_delete должно решить проблему бесконечного цикла.Из-за значения по умолчанию on_delete для ForeignKey каскадное использование логики pre_delete таким образом вызовет объект instance.context для вызова delete для instance, который затем вызовет instance.context и т.

def _post_delete_problem(sender, instance, **kwargs):
    instance.context.delete()
    instance.stat.delete()

post_delete.connect(_post_delete_problem, sender=Foo)

Может сделать очистку, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...