Django cascade deletion and post_delete
In my application, post_delete
signals are recorded in a specific model and when they were removed.
class A(models.Model):
...
class B(models.Model):
a = models.ForeignKey('A')
class C(models.Model):
b = models.ForeignKey('B')
def log_delete(sender, instance, **kwargs):
logging
post_delete.connect(log_delete, sender = A)
post_delete.connect(log_delete, sender = C)
Deleting an instance of cascading delete A deletes instances of B and C. How to turn off the signal for child instances on django delete cascade?
source to share
The short answer is:
You can not.
Long answer:
You need to override .delete
your Model
and model manager methodsQuerySet
I accomplished some similar task by getting an instance that was triggered by deletion using pre / post delete signals.
Here is the code https://gist.github.com/ar45/9c1448a91bcc94997ff0
source to share
Not an elegant solution as suggested by user2059857, but LOT is easier to implement:
Add a field to model A:
being_deleted = models.BooleanField(default=False)`
Set the parameter to True when the pre_delete model signal is triggered:
@receiver(models.signals.pre_delete, sender=A)
def a_pre_delete(sender, instance, **kwargs):
instance.being_deleted = True
instance.save()
Make sure being_deleted
your instance A is True in every pre_delete
child model and acts accordingly.
source to share