Django почему каскад внешних ключей модели не вызывает удаления?
существует два основных способа do something when an instance gets deleted
:
- Перезапись
Model.delete
- Сигнал
Раньше я считал, что оба они служат одной и той же цели, просто обеспечивают разные способы написания, но работают точно.
Однако в данном случае я понял, что был неправ:
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
при каскадировании? (Я знаю, что это скорее всего невозможно, так как это спецификация поля базы данных)