Deleting an inline can delete the whole inlined model instance recursively
|Reported by:||Dirk Eschler||Owned by:||nobody|
|Cc:||eschler@…, bugs@…||Triage Stage:||Accepted|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
A deleted inline can delete the whole inlined model (and all its related ForeignKeys) if the inlined model has a ForeignKey back to model it inlines. As this is best illustrated by an example, here's some code:
class Telephone(models.Model): TELEPHONE_TYPES = ( ('WORK', 'Work'), ('HOME', 'Home'), ) telephone_type = models.CharField(max_length=16, choices=TELEPHONE_TYPES) number = models.CharField(max_length=100) contact = models.ForeignKey('Contact') # ... class Contact(models.Model): family_name = models.CharField(max_length=255, null=True, blank=True) given_name = models.CharField(max_length=255, null=True, blank=True) # ... preferred_telephone = models.ForeignKey(Telephone, related_name='preferred_telephone', null=True, blank=True)
from class TelephoneInline(admin.TabularInline): model = Telephone class TelephoneAdmin(admin.ModelAdmin): # ... class ContactAdmin(admin.ModelAdmin): # ... inlines = [ TelephoneInline, ]
- Create a contact with a telephone number through the admin and save it
- Choose the new telephone number as preferred_telephone and save the contact
- Check the delete checkbox for the telephone number
The telephone number is deleted.
The contact is deleted recursively! In addition a 404 is raised that the contact doesn't exist, which is true.
If the Contact model had more relations, like a ForeignKey relation to an Address model for instance, all the addresses of the contact would have been deleted, too.