What is on_delete Attribute in Django Models

Django, a popular Python web framework, simplifies the process of building database-backed web applications. When defining models in Django, you often come across fields that involve relationships between different models. The on_delete attribute plays a vital role in these relationships, allowing you to specify what should happen when a related object is deleted.. In this blog, we’ll learn about into the on_delete attribute in Django models, explore its options, and provide practical examples to illustrate its usage.

Understand on_delete Attribute

The on_delete attribute is used in ForeignKey and OneToOneField fields within Django models. It defines the behavior to be executed when the referenced object (the related object) is deleted. Django provides several options for on_delete each serving a different purpose.

Common on_delete Options in Django

  1. CASCADE: This option is commonly used and means that when the referenced object is deleted, also delete the objects that have a foreign key or one-to-one relationship to it. This is useful for maintaining data integrity but should be used with caution to avoid unintended data loss.
  2. PROTECT: Prevents deletion of the referenced object by raising a ProtectedError exception if there are related objects. This helps maintain data integrity by blocking deletion when dependencies exist.
  3. SET_NULL: Sets the foreign key or one-to-one relationship to NULL when the referenced object is deleted. To use this option, you must also specify null=True for the field.
  4. SET_DEFAULT: Sets the field to its default value when the referenced object is deleted. To use this option, you must also specify a default value for the field.
  5. SET(): Allows you to specify a callable function that performs a custom action when the referenced object is deleted.
  6. DO_NOTHING: This option means that Django won’t do anything when the referenced object is deleted. It’s useful when you want to handle the deletion logic yourself.


Let’s illustrate the on_delete attribute with a practical example. Suppose you have a Django model representing a blog post with comments. Each comment is associated with a user, and you want to specify the behavior when a user is deleted:

from django.db import models
from django.contrib.auth.models import User

class BlogPost(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)

class Comment(models.Model):
    text = models.TextField()
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    post = models.ForeignKey(BlogPost, on_delete=models.CASCADE)

In this example:

  • The author field in the BlogPost model uses on_delete=models.CASCADE, which means that when a user is deleted, all of their authored blog posts will also be deleted.
  • The user field in the Comment model uses on_delete=models.SET_NULL, which sets the user field to NULL when the referenced user is deleted.

The on_delete attribute in Django models allows you to control how related objects behave when the referenced object is deleted. It’s a crucial feature for maintaining data integrity and specifying the desired behavior in your web applications. By choosing the appropriate on_delete option, you can ensure that your database relationships work seamlessly and handle data deletions in a way that aligns with your application’s requirements.