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?

+3


source to share


2 answers


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

0


source


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.

0


source







All Articles