Django почему каскад внешних ключей модели не вызывает удаления?

существует два основных способа do something when an instance gets deleted:

  1. Перезапись Model.delete
  2. Сигнал

Раньше я считал, что оба они служат одной и той же цели, просто обеспечивают разные способы написания, но работают точно.

Однако в данном случае я понял, что был неправ:


class Human(models.Model):
    name = models.CharField(max_length=20)


class Pet(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(Human, related_name="pet", on_delete=models.CASCADE)

    def delete(self, *args, **kwargs):
        print('------- Pet.delete is called')
        return super().delete(*args, **kwargs)



h = Human(name='jason')
h.save()
p = Pet(name="dog", owner=h)
p.save()

h.delete()
# nothing is shown

Почему Pet.delete не стреляет в Human.delete посторонним каскадом? Должен ли я применять к этому сигнал? Если да, то будет ли это стоить больше производительности?

Я строю что-то очень тяжелое, систему комментариев, фильтрую приличные записи и удаляю, когда прокомментированная цель удаляется, модель комментариев имеет много null-able foreign key полей, с models.CASCADE Set, только одному из них присваивается значение. Но в представлении удаления продукта, я вызываю product.delete Затем срабатывает cascade, но comment.delete не срабатывает.

В настоящее время в проекте есть delete Определено на многих моделях, с предположением, что it is always triggered when the instance get removed from database, и это огромная работа переписать это в сигнале. Есть ли способ вызвать delete при каскадировании? (Я знаю, что это скорее всего невозможно, так как это спецификация поля базы данных)

Вернуться на верх