Performance: Self-referencing relationships
This affects database query performance and page load speed when rendering nested or recursive data structures.
Jump into concepts and practice - no test required
class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE) # In view: categories = Category.objects.select_related('parent').all() for cat in categories: if cat.parent: print(cat.parent.name) # no extra queries
class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE) # In view: categories = Category.objects.all() for cat in categories: if cat.parent: print(cat.parent.name) # triggers a query per item
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| N+1 queries on self-referencing FK | Low | Low | Low | [X] Bad |
| select_related on self-referencing FK | Low | Low | Low | [OK] Good |
class Category(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)
c1 = Category(name='Root')
c1.save()
c2 = Category(name='Child', parent=c1)
c2.save()
print(c2.parent.name)
What will be printed?class Employee(models.Model):
name = models.CharField(max_length=100)
manager = models.ForeignKey(Employee, null=True, blank=True, on_delete=models.SET_NULL)