0
class Project(models.Model):
   name = models.CharField(max_length=100)
   project_results_m2m =  models.ManyToManyField(Project_Results,blank=True)

   def delete_all(self): 
        pass ### TO BE ADDED FROM ANSWERS

  • signal
@receiver(post_delete,sender=Project) 
def delete_project_signal(sender,instance,created=False,**kwargs):
    if created is False:
       instance.delete_all()
p = Project.objects.get(id=1)
p.delete() 
  • Once above delete() triggered on Project object 1 then the signal would execute delete_all function.

Now I would like to delete all objects of Project_Results related to project_results_m2m for Project object 1.

How do I achieve it in a safe manner while deleting, either with signals or without signals?

Arbazz Hussain
  • 1,622
  • 2
  • 15
  • 41
  • This may help. https://stackoverflow.com/questions/38388423/what-does-on-delete-do-on-django-models – Slyme Jan 17 '20 at 02:47
  • 1
    Is there a reason Project_Results don't have a ForeignKey pointing to Project? – Jonathan Richards Jan 17 '20 at 06:34
  • Question is related to M2M, if it would foriengkey then `models.cascade` would do it by default – Arbazz Hussain Jan 17 '20 at 06:45
  • Can a `Project_Results` be linked to multiple `Project`s? If so, do you still want to delete it when *any* of its `Project`s are deleted, or only when *all* of its `Project`s are deleted? If not, then you should almost certainly be using a ForeignKey instead of M2M. – Jonathan Richards Jan 17 '20 at 08:19

1 Answers1

2

Probably you need to use pre_delete signal:

from django.db.models.signals import pre_delete

@receiver(pre_delete, sender=Project, dispatch_uid='project_delete_all')
def delete_all_instances(sender, instance, using, **kwargs):
   instance.project_results_m2m.all().delete()
ruddra
  • 50,746
  • 7
  • 78
  • 101