77
Since Profile
links to User
, it is the dependent model in the relationship. Therefore when you delete a user, it deletes all dependent models. However when you delete a profile, since User
does not depend on profile, it is not removed.
Unfortunately, according to on_delete
Django docs, there is no on_delete
rule which deletes the parent relations. In order to do that, you can overwrite the Profile
‘s delete
method:
class Profile(models.Model):
# ...
def delete(self, *args, **kwargs):
self.user.delete()
return super(self.__class__, self).delete(*args, **kwargs)
Then when doing:
Profile.objects.get(...).delete()
will also delete the profile’s user. However the delete
method will not be called when deleting profiles using querysets (which is what is called in Django Admin) since then Django uses SQL DELETE to delete objects in bulk:
Profile.objects.filter(...).delete()
In that case, as recommended by Django docs, you will have to use post_delete
signal (docs).
from django.dispatch import receiver
from django.db.models.signals import post_delete
@receiver(post_delete, sender=Profile)
def post_delete_user(sender, instance, *args, **kwargs):
if instance.user: # just in case user is not specified
instance.user.delete()
15
Use a signal on the Profile
‘s delete method to go and delete the related User:
from django.db.models.signals import post_delete
def delete_related_user(sender, **kwargs):
deleted_profile = kwargs['instance']
deleted_profile.user.delete()
post_delete.connect(delete_related_user, sender=Profile)
- [Django]-Reload django object from database
- [Django]-Django serializer Imagefield to get full URL
- [Django]-Different db for testing in Django?