What Does on_delete Do on Django Models?

By hientd, at: July 13, 2025, 4:12 p.m.

Estimated Reading Time: __READING_TIME__ minutes

What Does on_delete Do on Django Models?
What Does on_delete Do on Django Models?

In Django, when you define a ForeignKey, the on_delete argument is required. It tells Django what to do when the referenced object is deleted.

 

Syntax:

 

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

 

If the Author is deleted, Django will follow the rule defined in on_delete to decide what happens to the related Book.

 

Common on_delete Options

 

Option Description
CASCADE Delete the related object too (e.g., delete all books if author is deleted)
PROTECT Prevent deletion of the referenced object; raises ProtectedError
SET_NULL Set the foreign key to NULL (requires null=True)
SET_DEFAULT Set to the field’s default value
SET(<function>)</function> Set to the result of a callable (e.g., SET(get_sentinel_user))
DO_NOTHING Do nothing (may cause database errors if not handled carefully)
RESTRICT (Django 3.1+) Prevent deletion if any related object exists

 

Example:

 

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

class Book(models.Model):
    author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)

 

In this case, if the author is deleted, the book’s author field is set to NULL.

 

Frequently Asked Questions (FAQs)

 

Q1. Is on_delete required in Django?

 

A: Yes. Since Django 2.0, it’s mandatory to define the on_delete behavior when using a ForeignKey or OneToOneField.

 

Q2. What’s the safest on_delete option?

 

A: PROTECT is generally safest—it prevents accidental deletion of referenced objects. RESTRICT (in Django 3.1+) is similar but more flexible with complex rules.

 

Q3. Can I use SET_NULL without null=True?

 

A: No. If you use SET_NULL, you must also declare null=True on the field, or Django will raise an error.

 

Q4. What’s the difference between CASCADE and SET_NULL?

 

A:

 

  • CASCADE deletes related objects too.
     

  • SET_NULL keeps related objects but clears the reference to the deleted object.

 

Q5. What happens if I use DO_NOTHING?

 

A: Django won’t do anything. But if the database doesn’t support empty foreign keys, it will throw an IntegrityError. You’ll need to handle the deletion manually.

 

Q6. What’s a real-world use case for SET(get_sentinel_user)?

 

A: Common in user models when a user is deleted, assign their content to a placeholder “anonymous” or “deleted” user instead of deleting it.

 

Tag list:

Subscribe

Subscribe to our newsletter and never miss out lastest news.