Foreign key relationships
@django @foreignkey @models
A ForeignKey relationship in Django is a many-to-one relationship.
So, if we have something like:
class Rating(models.Model):
user = models.ForeignKey(User)
It is a many-to-one relationship in that there are many Rating objects related to one User.
Foreign Key on_delete choices
- CASCADE When the referenced object is deleted, also delete the objects that have references to it (When you remove a blog post for instance, you might want to delete comments as well).
- PROTECT Forbid the deletion of the referenced object. To delete it you will have to delete all objects that reference it manually.
- SET_NULL Set the reference to NULL (requires the field to be nullable). For instance, when you delete a User, you might want to keep the comments he posted on blog posts, but say it was posted by an anonymous (or deleted) user.
- SET_DEFAULT Set the default value. SQL equivalent: SET DEFAULT.
- SET(...) Set a given value. This one is not part of the SQL standard and is entirely handled by Django.
- DO_NOTHING Probably a very bad idea since this would create integrity issues in your database (referencing an object that actually doesn't exist).
Foreign Key on_delete direction
Take the following example:
class Rating(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
In this case, with on_delete=CASCADE, if a Rating instance is deleted, the User instance is unaffected. However, if the User instance is deleted, then all of it's related Rating objects will also be deleted (hence the "cascade" effect)