Bird
Raised Fist0
Djangoframework~20 mins

Self-referencing relationships in Django - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Self-Referencing Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What is the output of this Django model's __str__ method?
Consider this Django model with a self-referencing ForeignKey. What will be printed when calling print(category) if category.name = 'Books' and category.parent = None?
Django
from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=100)
    parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.name} - Parent: {self.parent.name if self.parent else 'None'}"
ABooks - Parent: None
BBooks - Parent: Books
CBooks - Parent: ''
DBooks - Parent: Null
Attempts:
2 left
💡 Hint
Check how the __str__ method handles the parent attribute when it is None.
state_output
intermediate
2:00remaining
What is the value of child.parent.name after saving these objects?
Given this Django model and code, what is the value of child.parent.name after execution?
Django
from django.db import models

class Node(models.Model):
    name = models.CharField(max_length=50)
    parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE)

root = Node.objects.create(name='Root')
child = Node.objects.create(name='Child', parent=root)

result = child.parent.name
ARoot
BChild
CNone
DRaises AttributeError
Attempts:
2 left
💡 Hint
Look at how the parent is assigned when creating the child node.
📝 Syntax
advanced
2:30remaining
Which option correctly defines a self-referencing ManyToManyField in Django?
You want to create a Django model where each person can have many friends, and friends are also Person instances. Which code snippet correctly defines this self-referencing relationship?
Django
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    friends = ???
Amodels.ManyToManyField('self', symmetrical=False, blank=True)
Bmodels.ManyToManyField('Person', symmetrical=False)
Cmodels.ManyToManyField('self', symmetrical=True, blank=True)
Dmodels.ForeignKey('self', on_delete=models.CASCADE)
Attempts:
2 left
💡 Hint
Friends usually have a symmetrical relationship.
🔧 Debug
advanced
2:30remaining
Why does this self-referencing model raise a ValueError?
This Django model raises a ValueError when running migrations. What is the cause?
Django
from django.db import models

class Employee(models.Model):
    name = models.CharField(max_length=100)
    manager = models.ForeignKey('Employee', null=True, blank=True, on_delete=models.SET_NULL)
AThe model must inherit from models.SelfReferencingModel
BForeignKey cannot be null or blank in self-referencing models
Con_delete=models.SET_NULL is invalid for self-referencing fields
DThe ForeignKey must use a string 'self' instead of the class name Employee
Attempts:
2 left
💡 Hint
Check how Django handles self-referencing ForeignKey declarations.
🧠 Conceptual
expert
3:00remaining
What is the main difference between symmetrical=True and symmetrical=False in self-referencing ManyToManyFields?
In Django, when defining a self-referencing ManyToManyField, what does setting symmetrical=True versus symmetrical=False change about the relationship?
Asymmetrical=True disables the relationship; symmetrical=False enables it
Bsymmetrical=True means if A is related to B, then B is automatically related to A; symmetrical=False means the relationship is one-way
Csymmetrical=True requires a through model; symmetrical=False does not
Dsymmetrical=True only works with ForeignKey; symmetrical=False only works with ManyToManyField
Attempts:
2 left
💡 Hint
Think about friendship versus following relationships.

Practice

(1/5)
1. What does a self-referencing relationship in a Django model mean?
easy
A. A model has a field that links to another instance of the same model.
B. A model links to a different model using ForeignKey.
C. A model cannot have relationships with itself.
D. A model uses a ManyToManyField to link to another model.

Solution

  1. Step 1: Understand self-referencing relationships

    Self-referencing means a model links to itself, not to a different model.
  2. Step 2: Identify the correct description

    The correct description is that a model has a field linking to another instance of the same model.
  3. Final Answer:

    A model has a field that links to another instance of the same model. -> Option A
  4. Quick Check:

    Self-referencing = model links to itself [OK]
Hint: Self-reference means linking model to itself, not others [OK]
Common Mistakes:
  • Thinking self-reference links to a different model
  • Confusing ForeignKey with ManyToManyField
  • Believing models cannot link to themselves
2. Which of the following is the correct way to define a self-referencing ForeignKey in Django?
easy
A. parent = models.ForeignKey(ModelName, on_delete=models.CASCADE)
B. parent = models.ForeignKey(self, on_delete=models.CASCADE)
C. parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
D. parent = models.ForeignKey('ModelName', on_delete=models.CASCADE)

Solution

  1. Step 1: Recognize self-referencing syntax

    Use the string 'self' in ForeignKey to refer to the same model.
  2. Step 2: Check options for correct syntax

    Only parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) uses 'self' as a string and includes proper parameters.
  3. Final Answer:

    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) -> Option C
  4. Quick Check:

    Use 'self' string in ForeignKey for self-reference [OK]
Hint: Use 'self' as a string in ForeignKey for self-reference [OK]
Common Mistakes:
  • Using self without quotes
  • Using model class name instead of 'self'
  • Omitting null=True for optional links
3. Given this model:
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?
medium
A. Child
B. Root
C. None
D. Error

Solution

  1. Step 1: Understand the parent-child link

    c2's parent is set to c1, whose name is 'Root'.
  2. Step 2: Print c2.parent.name

    Accessing c2.parent.name prints 'Root'.
  3. Final Answer:

    Root -> Option B
  4. Quick Check:

    c2.parent.name = 'Root' [OK]
Hint: Parent points to another instance; print its name [OK]
Common Mistakes:
  • Expecting 'Child' instead of 'Root'
  • Assuming parent is None
  • Thinking it causes an error
4. What is wrong with this self-referencing model code?
class Employee(models.Model):
    name = models.CharField(max_length=100)
    manager = models.ForeignKey(Employee, null=True, blank=True, on_delete=models.SET_NULL)
medium
A. ForeignKey should use 'self' as a string, not the class name directly.
B. on_delete=models.SET_NULL is invalid for ForeignKey.
C. null=True and blank=True cannot be used together.
D. CharField must have unique=True for self-reference.

Solution

  1. Step 1: Check ForeignKey target

    For self-reference, use 'self' as a string, not the class name directly.
  2. Step 2: Validate other parameters

    on_delete=models.SET_NULL and null=True, blank=True are valid here.
  3. Final Answer:

    ForeignKey should use 'self' as a string, not the class name directly. -> Option A
  4. Quick Check:

    Use 'self' string in ForeignKey for self-reference [OK]
Hint: Use 'self' string in ForeignKey, not class name directly [OK]
Common Mistakes:
  • Using class name instead of 'self' string
  • Thinking on_delete=models.SET_NULL is invalid
  • Confusing null and blank usage
5. You want to create a Django model for a comment system where each comment can reply to another comment. Which is the best way to model this self-referencing relationship?
hard
A. Use a ForeignKey to another model called Reply.
B. Use a ManyToManyField to 'self' to link replies.
C. Use a OneToOneField to 'self' to link each comment to one reply.
D. Use a ForeignKey to 'self' with null=True and blank=True to allow top-level comments.

Solution

  1. Step 1: Understand comment-reply structure

    Each comment can optionally reply to one other comment or none (top-level).
  2. Step 2: Choose correct field type

    ForeignKey to 'self' with null=True and blank=True allows optional parent comment.
  3. Step 3: Evaluate other options

    ManyToManyField allows multiple parents, OneToOneField limits to one reply, and another model is unnecessary.
  4. Final Answer:

    Use a ForeignKey to 'self' with null=True and blank=True to allow top-level comments. -> Option D
  5. Quick Check:

    Comment replies = ForeignKey('self', optional) [OK]
Hint: Use ForeignKey('self') with null=True for optional parent [OK]
Common Mistakes:
  • Using ManyToManyField which allows multiple parents
  • Using OneToOneField which restricts replies
  • Creating unnecessary separate Reply model