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
Custom Serializer Fields in Django REST Framework
📖 Scenario: You are building a simple API for a bookstore. Each book has a title and a price stored as an integer number of cents. You want to show the price in dollars with two decimal places in the API response.
🎯 Goal: Create a Django REST Framework serializer with a custom field that converts the price from cents (integer) to a formatted string in dollars (e.g., '12.99').
📋 What You'll Learn
Create a dictionary called book_data with keys 'title' and 'price_cents' and values 'Django for Beginners' and 2599 respectively.
Create a class called PriceField that subclasses serializers.Field.
Implement the to_representation method in PriceField to convert cents to a string in dollars with two decimals.
Create a serializer class called BookSerializer that uses PriceField for the price field and includes the title field.
💡 Why This Matters
🌍 Real World
APIs often need to present data in a format that is easy for users to understand. Custom serializer fields let you control how data is shown without changing the database.
💼 Career
Knowing how to write custom serializer fields is useful for backend developers working with Django REST Framework to build clean, user-friendly APIs.
Progress0 / 4 steps
1
Create the initial book data dictionary
Create a dictionary called book_data with keys 'title' and 'price_cents' and values 'Django for Beginners' and 2599 respectively.
Django
Hint
Use curly braces to create a dictionary with the exact keys and values.
2
Create a custom serializer field class
Create a class called PriceField that subclasses serializers.Field.
Django
Hint
Define a class with the exact name PriceField and inherit from serializers.Field.
3
Implement the to_representation method
Inside the PriceField class, implement the to_representation method that takes value (price in cents) and returns a string formatted as dollars with two decimals (e.g., '25.99').
Django
Hint
Divide the integer value by 100 and format it as a string with two decimal places using an f-string.
4
Create the BookSerializer using the custom field
Create a serializer class called BookSerializer that subclasses serializers.Serializer. Add a title field as serializers.CharField() and a price field using the custom PriceField.
Django
Hint
Define the serializer class with the exact name and add the two fields as shown. Use source='price_cents' for the price field to map to the correct key in the data.
Practice
(1/5)
1. What is the main purpose of creating a custom serializer field in Django REST Framework?
easy
A. To style the API response with CSS
B. To create new database tables automatically
C. To handle user authentication and permissions
D. To control how data is converted to and from JSON format
Solution
Step 1: Understand serializer fields role
Serializer fields define how data is transformed between Python objects and JSON.
Step 2: Identify custom field purpose
Custom fields let you control this transformation, especially for special data formats.
Final Answer:
To control how data is converted to and from JSON format -> Option D
Quick Check:
Custom serializer fields = control data format [OK]
Hint: Custom fields change data format in API input/output [OK]
Common Mistakes:
Confusing serializer fields with database models
Thinking custom fields handle authentication
Assuming styling is done in serializers
2. Which method should you override in a custom serializer field to change how data is shown in API responses?
easy
A. to_internal_value
B. to_representation
C. validate
D. create
Solution
Step 1: Recall method roles in serializer fields
to_representation converts Python data to JSON output; to_internal_value converts input JSON to Python.
Step 2: Identify output formatting method
To change API response format, override to_representation.
Final Answer:
to_representation -> Option B
Quick Check:
Output formatting = to_representation [OK]
Hint: Output uses to_representation method [OK]
Common Mistakes:
Using to_internal_value for output formatting
Confusing validate with data conversion
Overriding create instead of serialization methods
3. Given this custom serializer field code, what will be the output for input value 10?
class DoubleField(serializers.Field):
def to_representation(self, value):
return value * 2
field = DoubleField()
print(field.to_representation(10))
medium
A. 20
B. '10'
C. 10
D. Error
Solution
Step 1: Analyze to_representation method
The method multiplies the input value by 2 before returning it.
Step 2: Calculate output for input 10
10 * 2 = 20, so the output is 20.
Final Answer:
20 -> Option A
Quick Check:
10 doubled = 20 [OK]
Hint: to_representation transforms output value [OK]
Common Mistakes:
Expecting input unchanged
Confusing output type as string
Assuming method raises error
4. Identify the error in this custom serializer field code:
class UpperCaseField(serializers.Field):
def to_internal_value(self, data):
return data.upper()
field = UpperCaseField()
print(field.to_internal_value(None))
medium
A. Field class must inherit from serializers.CharField
B. to_internal_value should return lowercase string
C. Calling upper() on None causes an AttributeError
D. to_internal_value method is missing a return statement
Solution
Step 1: Check method call on input
The code calls data.upper() but data is None, which has no upper() method.
Step 2: Identify error type
This causes an AttributeError at runtime.
Final Answer:
Calling upper() on None causes an AttributeError -> Option C
Quick Check:
None.upper() = AttributeError [OK]
Hint: Check input type before calling string methods [OK]
Common Mistakes:
Assuming None is valid string input
Thinking inheritance must be CharField
Missing return statement (actually present)
5. You want to create a custom serializer field that accepts a comma-separated string of numbers and outputs a list of integers. Which methods should you override and how?
hard
A. Override to_internal_value to split and convert input string; override to_representation to join list into string
B. Override to_representation to split input string; override to_internal_value to join list
C. Override validate to convert string to list; no need to override to_representation
D. Override create method to parse string; override update to format list
Solution
Step 1: Understand input and output roles
Input is a string (comma-separated), so to_internal_value must parse it into a list of integers.
Step 2: Format output for API response
to_representation should convert the list back into a comma-separated string for output.
Final Answer:
Override to_internal_value to split and convert input string; override to_representation to join list into string -> Option A