Performance: On_delete options (CASCADE, PROTECT, SET_NULL)
This affects database integrity and how related data changes impact page load and interaction speed when fetching or deleting related objects.
Jump into concepts and practice - no test required
class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE) # Deleting a Post automatically deletes related Comments in one operation.
class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.PROTECT) # Deleting a Post with many Comments raises errors and requires manual cleanup.
| Pattern | Database Queries | Deletion Blocking | Data Integrity | Verdict |
|---|---|---|---|---|
| CASCADE | Single query deletes related objects | No blocking | Automatic cleanup | [OK] Good |
| PROTECT | Multiple queries to check constraints | Blocks deletion | Prevents accidental loss | [! ] OK |
| SET_NULL | Single query sets foreign key to null | No blocking | Preserves dependent data | [OK] Good |
on_delete=models.CASCADE option do in Django models?SET_NULL in a Django ForeignKey field?null=True must be set.models.ForeignKey(OtherModel, on_delete=models.SET_NULL, null=True) includes null=True along with SET_NULL, making it valid syntax.class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.PROTECT)
title = models.CharField(max_length=100)Author who has related Book entries?class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.SET_NULL)
content = models.TextField()null=True.null=True on the post field, causing an error.class Category(models.Model):
name = models.CharField(max_length=50)
class Product(models.Model):
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=100)Category is deleted, what happens to the related Product entries and why is this setup useful?