Opened 9 years ago

Closed 9 years ago

Last modified 4 years ago

#16356 closed Bug (invalid)

Relationships in Django does not allow CASCADE delete

Reported by: eguevara2012@… Owned by: nobody
Component: Database layer (models, ORM) Version: 1.3
Severity: Normal Keywords: relationship
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Tim Graham)

I've been through this ticket alert that Django relationships are wrong.
A simple example:
An owner has an address.
A house has an address.

The classes would be:

class Owner(models.Model):
    address = models.ForeignKey(Address)
    #or better
    # address = models.OneToOneField(Address)
class House(models.Model):
    address = models.ForeignKey(Address)
    #or better
    # address = models.OneToOneField(Address)

class Address(models.Model):
    street = models.CharField(max_length=100)
    number = models.IntegerField(default=0)

This is the correct mapping following the logic of object-orientation, but this mapping does not allow remove related objects by CASCADE.
According to the Django doc, the mapping is inverse:

class Owner(models.Model):
    #other fields

class House(models.Model):
    #other fields    

class Adress(models.Model):
    street = models.CharField(max_length=100)
    number = models.IntegerField(default=0)
    owner = models.ForeignKey(Owner)
    house = models.ForeignKey(House)

The big problem is that this mapping in the form of owner the address form is shown with a select of houses, and in the form of owner is shown a form address with a select of owners.
Look, I want to register an owner and his address, this is end of the registration.
After i want register a house, register your address and there can select the owner to associate home with owner.

I urge to carefully read the Hibernate reference manual to understand how relationships should be made in Django:

I would like to examine this problem because i can not remove an owner and remove the house and address by CASCADE, and remove a house and its address by CASCADE using my firts example for mapping class.


Change History (2)

comment:1 Changed 9 years ago by Aymeric Augustin

Resolution: invalid
Status: newclosed

I urge you to read Django's documentation to understand how Django works and clear any confusion with other frameworks :)

More seriously, you have 1-to-1 relations, so you can put the Foreign Key in either model. Depending on the side of the relation where you put the Foreign Key, deletes will cascade or not. This is a SQL modeling issue, it isn't particularly related to Django.

This tracker is appropriate to report bugs in Django. "Django doesn't work like Hibernate" isn't a bug. For general usage questions, please join #django on FreeNode or post to the django-users mailing list.

Last edited 9 years ago by Aymeric Augustin (previous) (diff)

comment:2 Changed 4 years ago by Tim Graham

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top