Bird
Raised Fist0
Djangoframework~10 mins

ForeignKey for one-to-many in Django - Interactive Code Practice

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
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to define a ForeignKey field in a Django model.

Django
class Comment(models.Model):
    post = models.[1]('Post', on_delete=models.CASCADE)
    content = models.TextField()
Drag options to blanks, or click blank then click option'
AManyToManyField
BCharField
CForeignKey
DOneToOneField
Attempts:
3 left
💡 Hint
Common Mistakes
Using CharField instead of ForeignKey for relationships.
Using ManyToManyField when only one post per comment is needed.
2fill in blank
medium

Complete the code to specify the behavior when the related object is deleted.

Django
post = models.ForeignKey('Post', on_delete=models.[1])
Drag options to blanks, or click blank then click option'
ACASCADE
BSET_NULL
CPROTECT
DDO_NOTHING
Attempts:
3 left
💡 Hint
Common Mistakes
Using SET_NULL without allowing null values.
Choosing PROTECT which prevents deletion.
3fill in blank
hard

Fix the error in the ForeignKey declaration to allow null values.

Django
post = models.ForeignKey('Post', on_delete=models.CASCADE, [1]=True)
Drag options to blanks, or click blank then click option'
Adefault
Bnull
Cblank
Dunique
Attempts:
3 left
💡 Hint
Common Mistakes
Using blank=True only affects form validation, not database nullability.
Using default without a valid default value.
4fill in blank
hard

Fill both blanks to define a ForeignKey with a related name and allow null values.

Django
post = models.ForeignKey('Post', on_delete=models.CASCADE, [1]=True, related_name='[2]')
Drag options to blanks, or click blank then click option'
Anull
Bcomments
Cblank
Dposts
Attempts:
3 left
💡 Hint
Common Mistakes
Confusing related_name with the model name.
Forgetting to allow null if needed.
5fill in blank
hard

Fill all three blanks to create a ForeignKey with CASCADE delete, allow blank input, and set a related name.

Django
post = models.ForeignKey('Post', on_delete=models.[1], blank=[2], related_name='[3]')
Drag options to blanks, or click blank then click option'
APROTECT
BTrue
Ccomments
DCASCADE
Attempts:
3 left
💡 Hint
Common Mistakes
Using PROTECT instead of CASCADE for on_delete.
Confusing blank=True with null=True.
Incorrect related_name causing reverse lookup errors.

Practice

(1/5)
1. In Django, where should you place a ForeignKey field to represent a one-to-many relationship?
easy
A. In the model representing the 'many' side of the relationship
B. In the model representing the 'one' side of the relationship
C. In both models to link them together
D. You don't use ForeignKey for one-to-many relationships

Solution

  1. Step 1: Understand the one-to-many relationship

    One object on the 'one' side can relate to many objects on the 'many' side.
  2. Step 2: Place ForeignKey on the 'many' side

    The ForeignKey field goes in the model that represents the 'many' side to link back to the 'one' side.
  3. Final Answer:

    In the model representing the 'many' side of the relationship -> Option A
  4. Quick Check:

    ForeignKey on 'many' side = A [OK]
Hint: ForeignKey always goes on the 'many' side model [OK]
Common Mistakes:
  • Putting ForeignKey on the 'one' side model
  • Adding ForeignKey to both models
  • Thinking ForeignKey is not used for one-to-many
2. Which of the following is the correct syntax to define a ForeignKey in a Django model named Book that links to a model named Author?
easy
A. author = models.ForeignKey(Author, delete=models.CASCADE)
B. author = models.ForeignKey(Author, on_delete=models.CASCADE)
C. author = models.ForeignKey('Author')
D. author = models.ForeignKey(Author, on_delete='CASCADE')

Solution

  1. Step 1: Check ForeignKey syntax

    ForeignKey requires the related model and the on_delete argument to specify delete behavior.
  2. Step 2: Validate correct usage

    author = models.ForeignKey(Author, on_delete=models.CASCADE) correctly uses on_delete=models.CASCADE. Options A, B, and D have syntax errors or missing required arguments.
  3. Final Answer:

    author = models.ForeignKey(Author, on_delete=models.CASCADE) -> Option B
  4. Quick Check:

    Correct ForeignKey syntax = C [OK]
Hint: Always include on_delete=models.CASCADE with ForeignKey [OK]
Common Mistakes:
  • Omitting on_delete argument
  • Using wrong argument name like delete
  • Passing on_delete as string instead of constant
3. Given these models:
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

What will Book.objects.filter(author__name='Alice').count() return if there are 3 books by Alice and 2 by Bob?
medium
A. 0
B. 2
C. 5
D. 3

Solution

  1. Step 1: Understand the filter query

    The query filters books where the related author's name is 'Alice'.
  2. Step 2: Count matching books

    Since 3 books belong to Alice, the count will be 3.
  3. Final Answer:

    3 -> Option D
  4. Quick Check:

    Books by Alice = 3 [OK]
Hint: Filter on related model with double underscore __ [OK]
Common Mistakes:
  • Counting authors instead of books
  • Using single underscore instead of double
  • Confusing author name with book title
4. What is wrong with this Django model code?
class Comment(models.Model):
    post = models.ForeignKey(Post)
    text = models.TextField()
medium
A. TextField cannot be used for text
B. ForeignKey should be named post_id
C. Missing on_delete argument in ForeignKey
D. ForeignKey should be in Post model

Solution

  1. Step 1: Check ForeignKey arguments

    Since Django 2.0, on_delete is required for ForeignKey fields.
  2. Step 2: Identify missing on_delete

    The code lacks on_delete, causing an error.
  3. Final Answer:

    Missing on_delete argument in ForeignKey -> Option C
  4. Quick Check:

    ForeignKey requires on_delete argument [OK]
Hint: Always add on_delete to ForeignKey fields [OK]
Common Mistakes:
  • Forgetting on_delete causes errors
  • Renaming ForeignKey field incorrectly
  • Thinking TextField is invalid for text
5. You have these models:
class Category(models.Model):
    name = models.CharField(max_length=50)

class Product(models.Model):
    name = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)

If a Category is deleted, what happens to its related Products?
hard
A. Products remain but their category field is set to NULL
B. Products are deleted automatically
C. Deletion of Category is blocked if Products exist
D. Products keep the deleted category reference

Solution

  1. Step 1: Understand on_delete=models.SET_NULL

    This option sets the ForeignKey field to NULL when the related object is deleted.
  2. Step 2: Apply to Product-Category relation

    When a Category is deleted, related Products keep their records but their category field becomes NULL.
  3. Final Answer:

    Products remain but their category field is set to NULL -> Option A
  4. Quick Check:

    on_delete=SET_NULL means keep products, nullify category [OK]
Hint: SET_NULL keeps related objects, clears ForeignKey [OK]
Common Mistakes:
  • Assuming related objects are deleted
  • Thinking deletion is blocked
  • Believing ForeignKey keeps deleted references