what does on_delete do on Django models?
I'm quite familiar with Django, but recently noticed there exists an
on_delete=models.CASCADE option with the models, I have searched for the documentation for the same but couldn't find anything more than:
Changed in Django 1.9:
on_deletecan now be used as the second positional argument (previously it was typically only passed as a keyword argument). It will be a required argument in Django 2.0.
from django.db import models class Car(models.Model): manufacturer = models.ForeignKey( 'Manufacturer', on_delete=models.CASCADE, ) # ... class Manufacturer(models.Model): # ... pass
What does on_delete do? ( I guess the actions to be done if the model is deleted )
models.CASCADE do? ( any hints in documentation )
What other options are available ( if my guess is correct )?
Where does the documentation for this reside?
This is the behaviour to adopt when the referenced object is deleted. It is not specific to django, this is an SQL standard.
There are 6 possible actions to take when such event occurs:
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). SQL equivalent:
PROTECT: Forbid the deletion of the referenced object. To delete it you will have to delete all objects that reference it manually. SQL equivalent:
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. SQL equivalent:
SET_DEFAULT: Set the default value. SQL equivalent:
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). SQL equivalent:
Source: Django documentation
See also the documentation of PostGreSQL for instance.
In most cases,
CASCADE is the expected behaviour, but for every ForeignKey, you should always ask yourself what is the expected behaviour in this situation.
SET_NULL are often useful. Setting
CASCADE where it should not, can potentially delete all your database in cascade, by simply deleting a single user.