Django on_delete

What is Django on_delete and how do you use it? on_delete determines what happens to an object or field that references an object that got deleted. Let’s take a look at some examples:

class Author(models.Model):
    name = models.CharField()

class Post(models.Model):
    models.ForeignKey('Author', on_delete=models.CASCADE)

Cascade, means that when Author gets deleted, the Post that references that Author also gets deleted.

You have the following options:

  • CASCADE – the object that references the deleted object gets deleted itself
  • PROTECT – Prevents the deletion of the referenced object by raising a ProtectedError exception
  • SET_NULL – Sets the field to null. Only possible if the field is nullable, otherwise will throw an error when you try to run the application
  • SET_DEFAULT – Sets the field to its default value. Only possible if the field has a default value, otherwise will throw an error when you try to run the application
  • SET() – Can either be a value or a callable. Here’s an example:
def get_default_author():
    return Author.object.get(name='default')

class Author(models.Model):
    name = models.CharField()

class Post(models.Model):
    models.ForeignKey('Author', on_delete=models.SET(get_default_author))
  • DO_NOTHING – don’t do anything. If your database enforces foreign keys this will cause an IntegrityError.

What option should you use for Django on_delete?

That really depends on your specific scenario. Let’s say you are writing a shopping cart and you want to associate each order with a credit card. Even if the user deletes a credit card, you still want to keep the order around, so you would set it to SET_NULL. If on the other hand you are trying to create a site that catalogs books for authors, it wouldn’t make any sense to keep around books after an author was deleted, so you would set it to CASCADE.