Cuando un objeto referenciado por una clave foránea (ForeignKey) es eliminado, Django por omisión emula el comportamiento de la sentencia SQL ON DELETE CASCADE y también se elimina el objeto que contiene el ForeignKey.
A partir de la versión 1.3 de Django el comportamiento descrito en el párrafo anterior puede ser sobreescrito al especificar el argumento on_delete. Por ejemplo, si usted permite que una clave foránea pueda ser nula y usted desea que sea establecida a NULL cuando un objeto referenciado sea eliminado:
Los posibles valores para el argumento on_delete pueden encontrarse en django.db.models:
CASCADE: Eliminación en cascada, el comportamiento por omisión.
PROTECT: Prevee la eliminación del objeto referenciado al lanzar una excepción del tipo: django.db-IntegrityError.
SET_NULL: Establece la clave foránea a NULL, esto solo es posible si el argumento null es True.
SET_DEFAULT: Establece la clave foránea a su valor por omisión, tenga en cuenta que un valor por omisión debe ser establecido.
SET(): Establece el valor del ForeignKey indicado en SET(), si una función es invocada, el resultado de dicha función será el valor establecido.
DO_NOTHING: No tomar acciones. Si el gestor de base de datos requiere integridad referencial, esto causará una excepción del tipo IntegrityError.
A continuación un par de ejemplos de esta nueva funcionalidad:
Nuestra sesión interactiva con el API sería similar a la siguiente:
$ python manage.py shell
Un segundo ejemplo, ahora haciendo uso del valor SET() en el argumento on_delete:
Nuestra sesión interactiva con el API sería similar a la siguiente: