📖 Scenario: You are building a simple Django app to manage books and their authors. Each book has one author, and each author can have multiple books.
🎯 Goal: Create two Django models, Author and Book, with a one-to-many relationship. Then, write a query to get all books by a specific author.
📋 What You'll Learn
Create an Author model with a name field
Create a Book model with a title field and a foreign key to Author
Create a variable author_name with the value 'Jane Austen'
Write a Django ORM query to get all books by the author with name author_name
💡 Why This Matters
🌍 Real World
Managing related data like authors and books is common in library or bookstore apps.
💼 Career
Understanding model relationships and queries is essential for backend Django development.
Progress0 / 4 steps
1
Create the Author model
Create a Django model called Author with a single field name as a CharField with max length 100.
Django
Hint
Use models.CharField(max_length=100) for the name field.
2
Create the Book model with a foreign key
Create a Django model called Book with a title field as CharField max length 200, and a foreign key field called author linking to the Author model with on_delete=models.CASCADE.
Django
Hint
Use models.ForeignKey(Author, on_delete=models.CASCADE) for the author field.
3
Create the author_name variable
Create a variable called author_name and set it to the string 'Jane Austen'.
Django
Hint
Set author_name exactly to 'Jane Austen'.
4
Query books by author name
Write a Django ORM query to get all Book objects where the related Author's name matches the variable author_name. Assign the result to a variable called books_by_author.
Django
Hint
Use Book.objects.filter(author__name=author_name) to get books by author name.
Practice
(1/5)
1. Which Django model field type represents a many-to-one relationship?
easy
A. ForeignKey
B. OneToOneField
C. ManyToManyField
D. CharField
Solution
Step 1: Understand relationship types in Django models
Django uses ForeignKey for many-to-one, OneToOneField for one-to-one, and ManyToManyField for many-to-many relationships.
Step 2: Match the field to many-to-one relationship
The ForeignKey field connects many instances of one model to a single instance of another model, representing many-to-one.
Final Answer:
ForeignKey -> Option A
Quick Check:
Many-to-one = ForeignKey [OK]
Hint: ForeignKey always means many-to-one relation [OK]
Common Mistakes:
Confusing OneToOneField with ForeignKey
Thinking ManyToManyField is many-to-one
Using CharField for relationships
2. Which of the following is the correct syntax to define a one-to-one relationship in a Django model?
easy
A. user = models.ForeignKey(User, on_delete=models.CASCADE)
B. email = models.CharField(max_length=100)
C. groups = models.ManyToManyField(Group)
D. profile = models.OneToOneField(User, on_delete=models.CASCADE)
Solution
Step 1: Identify the field for one-to-one relationship
The OneToOneField is used to create a one-to-one link between two models.
Step 2: Check the syntax correctness
The syntax profile = models.OneToOneField(User, on_delete=models.CASCADE) correctly defines a one-to-one relationship with proper arguments.
Final Answer:
profile = models.OneToOneField(User, on_delete=models.CASCADE) -> Option D
Hint: OneToOneField uses on_delete argument like ForeignKey [OK]
Common Mistakes:
Using ForeignKey instead of OneToOneField
Omitting on_delete argument
Confusing ManyToManyField syntax
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.author.name return if book is a Book instance?
medium
A. The name of the author related to the book
B. The title of the book
C. An error because author is a ForeignKey
D. The id of the author
Solution
Step 1: Understand ForeignKey access in Django
A ForeignKey field allows access to the related model instance. So book.author gives the Author instance linked to the book.
Step 2: Access the related model's attribute
Using book.author.name accesses the name attribute of the related Author instance, returning the author's name.
Final Answer:
The name of the author related to the book -> Option A
Quick Check:
ForeignKey attribute access returns related model data [OK]
Hint: ForeignKey lets you access related object attributes directly [OK]
Common Mistakes:
Expecting book.author to be just an ID
Thinking book.author.name causes error
Confusing book.title with author name
4. Identify the error in this Django model relationship:
class Profile(models.Model):
user = models.OneToOneField(User)
bio = models.TextField()
medium
A. OneToOneField should be ForeignKey
B. Missing on_delete argument in OneToOneField
C. TextField cannot be used for bio
D. User model must be imported
Solution
Step 1: Check OneToOneField required arguments
Django requires the on_delete argument for relationship fields like OneToOneField to specify behavior on deletion.
Step 2: Identify missing argument
The model misses on_delete=models.CASCADE or similar, which causes an error.
Final Answer:
Missing on_delete argument in OneToOneField -> Option B
Quick Check:
Relationship fields need on_delete argument [OK]
Hint: Always add on_delete to OneToOneField and ForeignKey [OK]
Common Mistakes:
Omitting on_delete argument
Confusing OneToOneField with ForeignKey
Assuming TextField is invalid for bio
5. You want to model a social app where users can follow many other users and be followed by many users. Which Django model field setup correctly represents this many-to-many self-relationship?
hard
A. followers = models.OneToOneField('self', on_delete=models.CASCADE)
B. followers = models.ForeignKey('self', on_delete=models.CASCADE)
C. followers = models.ManyToManyField('self', symmetrical=False, related_name='following')
D. followers = models.ManyToManyField(User)
Solution
Step 1: Understand many-to-many self-relationship
Users can follow many users and be followed by many, so a many-to-many relationship to self is needed.
Step 2: Check correct ManyToManyField syntax for self
Using ManyToManyField('self', symmetrical=False, related_name='following') correctly models directed follow relationships.
Final Answer:
followers = models.ManyToManyField('self', symmetrical=False, related_name='following') -> Option C
Quick Check:
ManyToManyField to 'self' with symmetrical=False models follow [OK]
Hint: Use ManyToManyField('self', symmetrical=False) for directed self-relations [OK]
Common Mistakes:
Using ForeignKey or OneToOneField for many-to-many
Omitting symmetrical=False for directed relation
Using ManyToManyField(User) instead of 'self'
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.