Bird
Raised Fist0
Djangoframework~20 mins

Primary key behavior in Django - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Primary Key Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
What is the primary key value after saving a new Django model instance?

Consider this Django model and code snippet:

class Book(models.Model):
    title = models.CharField(max_length=100)

book = Book(title='Django Basics')
book.save()
print(book.pk)

What will print(book.pk) output?

Django
class Book(models.Model):
    title = models.CharField(max_length=100)

book = Book(title='Django Basics')
book.save()
print(book.pk)
AThe integer ID assigned by the database after saving, e.g., 1
BNone, because the primary key is not set until manually assigned
CRaises an AttributeError because pk is not defined
DThe title string 'Django Basics' as the primary key
Attempts:
2 left
💡 Hint

Think about what Django does when you save a new model instance without specifying a primary key.

📝 Syntax
intermediate
2:00remaining
Which model definition correctly sets a custom primary key in Django?

Choose the correct Django model code that defines a username field as the primary key.

A
class User(models.Model):
    username = models.CharField(max_length=30, primary_key=True)
    email = models.EmailField()
B
class User(models.Model):
    username = models.CharField(max_length=30)
    email = models.EmailField()
    primary_key = 'username'
C
class User(models.Model):
    username = models.CharField(max_length=30)
    email = models.EmailField()

    class Meta:
        primary_key = 'username'
D
class User(models.Model):
    username = models.CharField(max_length=30, unique=True)
    email = models.EmailField()
Attempts:
2 left
💡 Hint

Remember how to mark a field as primary key in Django model fields.

🔧 Debug
advanced
2:30remaining
Does this Django model raise an error on migration?

Given this model:

class Product(models.Model):
    sku = models.CharField(max_length=20, primary_key=True)
    name = models.CharField(max_length=100)

class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField()

Running migrations: does it raise an error about missing primary key?

Django
class Product(models.Model):
    sku = models.CharField(max_length=20, primary_key=True)
    name = models.CharField(max_length=100)

class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField()
AForeignKey must reference a field named 'id' by default, so referencing 'sku' causes error
BThe Product model must have an explicit 'id' field even if 'sku' is primary key
CNo error occurs; the code is valid and migrations run fine
DThe ForeignKey needs to specify 'to_field="sku"' to link to the custom primary key
Attempts:
2 left
💡 Hint

Think about how ForeignKey determines which field to reference on the target model when it has a custom primary key.

❓ state_output
advanced
2:00remaining
What is the value of the primary key after updating a Django model instance?

Given this code:

class Customer(models.Model):
    email = models.EmailField(primary_key=True)
    name = models.CharField(max_length=50)

c = Customer(email='a@example.com', name='Alice')
c.save()
c.name = 'Alice Smith'
c.save()
print(c.pk)

What will print(c.pk) output?

Django
class Customer(models.Model):
    email = models.EmailField(primary_key=True)
    name = models.CharField(max_length=50)

c = Customer(email='a@example.com', name='Alice')
c.save()
c.name = 'Alice Smith'
c.save()
print(c.pk)
ANone, because updating clears the primary key
B'a@example.com', the primary key remains the same after update
CRaises a ValueError because primary key cannot be updated
DThe name 'Alice Smith' because primary key changes to last saved field
Attempts:
2 left
💡 Hint

Think about whether the primary key changes when you update other fields.

🧠 Conceptual
expert
3:00remaining
What happens if you define two fields with primary_key=True in a Django model?

Consider this model:

class Employee(models.Model):
    emp_id = models.IntegerField(primary_key=True)
    badge_id = models.CharField(max_length=10, primary_key=True)
    name = models.CharField(max_length=50)

What will happen when you try to run migrations?

Django
class Employee(models.Model):
    emp_id = models.IntegerField(primary_key=True)
    badge_id = models.CharField(max_length=10, primary_key=True)
    name = models.CharField(max_length=50)
AMigrations succeed but database throws an error at runtime
BCreates a composite primary key with both fields combined
COnly the first primary_key=True field is used; the second is ignored
DRaises a SystemCheckError because Django models cannot have multiple primary keys
Attempts:
2 left
💡 Hint

Recall Django's rules about primary keys in models.

Practice

(1/5)
1. What does Django do if you do not specify a primary key in your model?
easy
A. Uses the first field defined as the primary key.
B. Automatically adds an id field as the primary key.
C. Raises an error and refuses to create the model.
D. Requires you to manually add a primary key later.

Solution

  1. Step 1: Understand Django's default behavior

    Django automatically adds an id field as a primary key if none is specified.
  2. Step 2: Confirm no error or manual step needed

    No error is raised and no manual primary key is required by default.
  3. Final Answer:

    Automatically adds an id field as the primary key. -> Option B
  4. Quick Check:

    Default primary key = id field [OK]
Hint: Remember: Django adds id automatically if no primary key [OK]
Common Mistakes:
  • Thinking Django raises an error without a primary key
  • Assuming first field is primary key by default
  • Believing manual primary key is always required
2. Which of the following is the correct way to set a field as the primary key in a Django model?
easy
A. name = models.CharField(max_length=100, primary_key=True)
B. name = models.CharField(max_length=100, key_primary=True)
C. name = models.CharField(max_length=100, primary=True)
D. name = models.CharField(max_length=100, is_primary=True)

Solution

  1. Step 1: Identify correct keyword argument

    The correct argument to set a primary key is primary_key=True.
  2. Step 2: Match with options

    Only name = models.CharField(max_length=100, primary_key=True) uses primary_key=True correctly.
  3. Final Answer:

    name = models.CharField(max_length=100, primary_key=True) -> Option A
  4. Quick Check:

    Use primary_key=True to set primary key [OK]
Hint: Use primary_key=True exactly to set primary key [OK]
Common Mistakes:
  • Using incorrect argument names like primary=True
  • Confusing primary_key with other flags
  • Misspelling primary_key
3. Given this model:
class Product(models.Model):
    sku = models.CharField(max_length=20, primary_key=True)
    name = models.CharField(max_length=100)

p = Product(sku='X123', name='Widget')
p.save()
print(Product.objects.get(pk='X123').name)
What will be printed?
medium
A. None
B. X123
C. Error: No primary key field found
D. Widget

Solution

  1. Step 1: Understand primary key usage

    The sku field is set as primary key, so pk='X123' looks up by sku.
  2. Step 2: Trace the query result

    The object with sku 'X123' has name 'Widget', so printing .name outputs 'Widget'.
  3. Final Answer:

    Widget -> Option D
  4. Quick Check:

    Primary key lookup returns object name [OK]
Hint: pk uses the primary key field, here sku, to find object [OK]
Common Mistakes:
  • Assuming pk means id field always
  • Expecting error because id field missing
  • Confusing printed value with primary key value
4. What is wrong with this model definition?
class Customer(models.Model):
    id = models.IntegerField(primary_key=True)
    id = models.CharField(max_length=10, primary_key=True)
medium
A. You must use AutoField for primary keys, not IntegerField or CharField.
B. Primary keys cannot be named 'id'.
C. You cannot have two fields with primary_key=True in the same model.
D. The model is missing a Meta class to define primary key.

Solution

  1. Step 1: Check primary key uniqueness in model

    A Django model can have only one primary key field.
  2. Step 2: Identify duplicate primary_key=True fields

    Here, two fields named 'id' are declared with primary_key=True, which is invalid.
  3. Final Answer:

    You cannot have two fields with primary_key=True in the same model. -> Option C
  4. Quick Check:

    Only one primary key allowed per model [OK]
Hint: Only one field can have primary_key=True in a model [OK]
Common Mistakes:
  • Thinking multiple primary keys are allowed
  • Believing primary key must be AutoField
  • Assuming primary key name restrictions
5. You want to create a Django model where the email field uniquely identifies each user and acts as the primary key. Which is the best way to define this model?
hard
A.
class User(models.Model):
    email = models.EmailField(primary_key=True)
    name = models.CharField(max_length=100)
B.
class User(models.Model):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=100)
C.
class User(models.Model):
    id = models.AutoField(primary_key=True)
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=100)
D.
class User(models.Model):
    email = models.EmailField()
    name = models.CharField(max_length=100)
    class Meta:
        primary_key = 'email'

Solution

  1. Step 1: Understand primary key vs unique

    Primary key uniquely identifies records and is used as the main identifier.
  2. Step 2: Check options for setting email as primary key

    class User(models.Model):
        email = models.EmailField(primary_key=True)
        name = models.CharField(max_length=100)
    sets email as primary key directly, which is correct.
    class User(models.Model):
        email = models.EmailField(unique=True)
        name = models.CharField(max_length=100)
    only makes it unique but not primary key.
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        email = models.EmailField(unique=True)
        name = models.CharField(max_length=100)
    keeps default id as primary key.
    class User(models.Model):
        email = models.EmailField()
        name = models.CharField(max_length=100)
        class Meta:
            primary_key = 'email'
    uses invalid Meta syntax.
  3. Final Answer:

    Define email with primary_key=True in the model field. -> Option A
  4. Quick Check:

    Set primary_key=True on email field to make it primary key [OK]
Hint: Use primary_key=True on email field to make it primary key [OK]
Common Mistakes:
  • Using unique=True instead of primary_key=True
  • Keeping default id field as primary key
  • Trying to set primary key in Meta class
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard