Bird
Raised Fist0
Djangoframework~20 mins

OneToOneField for one-to-one 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
🎖️
OneToOneField Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
component_behavior
intermediate
2:00remaining
What happens when you access a related object via OneToOneField?

Consider these Django models:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()

If you have a User instance u, what does u.profile return?

AThe <code>Profile</code> instance linked to <code>u</code>, or raises <code>Profile.DoesNotExist</code> if none exists
BAlways returns None
CThe <code>User</code> instance itself
DA list of all <code>Profile</code> instances linked to <code>u</code>
Attempts:
2 left
💡 Hint

Think about how OneToOneField creates a direct link between two models.

📝 Syntax
intermediate
2:00remaining
Which is the correct way to define a OneToOneField in Django?

Choose the correct syntax to define a one-to-one relationship from Profile to User:

Auser = models.ManyToManyField(User)
Buser = models.ForeignKey(User, unique=True, on_delete=models.CASCADE)
Cuser = models.OneToOneField(User, on_delete=models.CASCADE)
Duser = models.OneToManyField(User)
Attempts:
2 left
💡 Hint

OneToOneField is a specific field type in Django models.

🔧 Debug
advanced
2:00remaining
Why does accessing a OneToOneField related object raise an error?

Given these models:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

u = User.objects.create(username='alice')
print(u.profile)

This code raises Profile.DoesNotExist. Why?

ABecause <code>on_delete=models.CASCADE</code> deletes the <code>User</code> instance
BBecause <code>OneToOneField</code> requires <code>null=True</code> to work
CBecause <code>User</code> model does not have a <code>profile</code> attribute by default
DBecause no <code>Profile</code> instance linked to <code>u</code> exists yet
Attempts:
2 left
💡 Hint

Think about what happens if the related object is missing.

state_output
advanced
2:00remaining
What is the output of this Django shell code involving OneToOneField?

Given these models and code:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.CharField(max_length=100)

u = User.objects.create(username='bob')
p = Profile.objects.create(user=u, bio='Hello')
print(u.profile.bio)

What will be printed?

Abob
BHello
CProfile object at some memory address
DRaises Profile.DoesNotExist
Attempts:
2 left
💡 Hint

Remember that u.profile accesses the related Profile instance.

🧠 Conceptual
expert
3:00remaining
Why use OneToOneField instead of ForeignKey with unique=True?

In Django, both OneToOneField and ForeignKey with unique=True can enforce one-to-one relationships. Why is OneToOneField preferred?

AOneToOneField creates a reverse attribute on the related model automatically, improving code clarity and access
BForeignKey with unique=True does not enforce uniqueness at the database level
COneToOneField allows multiple related objects, unlike ForeignKey
DForeignKey with unique=True is deprecated and no longer supported in Django
Attempts:
2 left
💡 Hint

Think about how Django creates reverse relations and the developer experience.

Practice

(1/5)
1. What is the main purpose of Django's OneToOneField?
easy
A. To store multiple values in a single database field
B. To create a many-to-many relationship between two models
C. To allow multiple records in one model to link to a single record in another
D. To link two models so each record in one matches exactly one record in the other

Solution

  1. Step 1: Understand the relationship types in Django

    Django provides different fields for relationships: ForeignKey for many-to-one, ManyToManyField for many-to-many, and OneToOneField for one-to-one.
  2. Step 2: Identify the purpose of OneToOneField

    OneToOneField links exactly one record in one model to exactly one record in another, ensuring a unique pairing.
  3. Final Answer:

    To link two models so each record in one matches exactly one record in the other -> Option D
  4. Quick Check:

    OneToOneField = unique pair link [OK]
Hint: OneToOneField means one record matches one record only [OK]
Common Mistakes:
  • Confusing OneToOneField with ForeignKey
  • Thinking it allows multiple links per record
  • Using it to store multiple values in one field
2. Which of the following is the correct way to define a OneToOneField in a Django model?
easy
A. user = models.ForeignKey(User, on_delete=models.CASCADE)
B. user = models.OneToOneField(User)
C. user = models.OneToOneField(User, on_delete=models.CASCADE)
D. user = models.ManyToManyField(User)

Solution

  1. Step 1: Check required parameters for OneToOneField

    OneToOneField requires the related model and the on_delete argument to specify behavior on deletion.
  2. Step 2: Validate the options

    user = models.OneToOneField(User, on_delete=models.CASCADE) correctly includes both the related model and on_delete=models.CASCADE. user = models.OneToOneField(User) misses on_delete, which is mandatory.
  3. Final Answer:

    user = models.OneToOneField(User, on_delete=models.CASCADE) -> Option C
  4. Quick Check:

    OneToOneField needs on_delete [OK]
Hint: Always include on_delete with OneToOneField [OK]
Common Mistakes:
  • Omitting on_delete argument
  • Using ForeignKey or ManyToManyField instead
  • Incorrect field syntax
3. Given these models:
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField()

user = User.objects.create(username='anna')
profile = Profile.objects.create(user=user, bio='Hello!')
print(profile.user.username)

What will be printed?
medium
A. Hello!
B. anna
C. profile
D. Error: user attribute missing

Solution

  1. Step 1: Understand the OneToOneField link

    The Profile model links to User via OneToOneField named 'user'. The profile instance has a user with username 'anna'.
  2. Step 2: Evaluate the print statement

    Accessing profile.user.username fetches the username of the linked User, which is 'anna'.
  3. Final Answer:

    anna -> Option B
  4. Quick Check:

    profile.user.username = anna [OK]
Hint: Access linked user via profile.user.username [OK]
Common Mistakes:
  • Printing profile.bio instead of username
  • Confusing attribute names
  • Assuming user attribute is missing
4. What is wrong with this model definition?
class Employee(models.Model):
    user = models.OneToOneField(User)
    department = models.CharField(max_length=100)
medium
A. Missing on_delete argument in OneToOneField
B. OneToOneField cannot link to User model
C. department field must be IntegerField
D. OneToOneField should be ForeignKey

Solution

  1. Step 1: Check OneToOneField requirements

    OneToOneField requires the on_delete argument to specify what happens if the linked User is deleted.
  2. Step 2: Analyze the model code

    The model misses on_delete, which will cause an error when running migrations or server start.
  3. Final Answer:

    Missing on_delete argument in OneToOneField -> Option A
  4. Quick Check:

    OneToOneField needs on_delete [OK]
Hint: Always add on_delete to OneToOneField [OK]
Common Mistakes:
  • Forgetting on_delete causes errors
  • Thinking OneToOneField can't link to User
  • Confusing field types for department
5. You want to extend Django's User model to add a phone number without modifying the original User table. Which is the best way to do this using OneToOneField?
hard
A. Create a new Profile model with a OneToOneField to User and add phone number there
B. Add a phone number field directly to the User model
C. Use a ForeignKey from User to Profile with phone number
D. Create a ManyToManyField between User and phone numbers

Solution

  1. Step 1: Understand extending User without changing it

    To add extra info without altering User, create a separate model linked one-to-one to User.
  2. Step 2: Choose the correct relationship

    OneToOneField in a Profile model allows storing phone number linked uniquely to each User.
  3. Final Answer:

    Create a new Profile model with a OneToOneField to User and add phone number there -> Option A
  4. Quick Check:

    Extend User via OneToOneField in separate model [OK]
Hint: Use OneToOneField in new model to extend User [OK]
Common Mistakes:
  • Modifying User model directly
  • Using ForeignKey or ManyToManyField incorrectly
  • Not linking phone number uniquely to User