Consider this Django REST Framework serializer:
from rest_framework import serializers
class ProductSerializer(serializers.Serializer):
name = serializers.CharField(max_length=100)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
serializer = ProductSerializer(data={'name': 'Pen', 'price': '12.345'})
valid = serializer.is_valid()
errors = serializer.errors
What will be the value of valid and errors after running this code?
from rest_framework import serializers class ProductSerializer(serializers.Serializer): name = serializers.CharField(max_length=100) price = serializers.DecimalField(max_digits=5, decimal_places=2) serializer = ProductSerializer(data={'name': 'Pen', 'price': '12.345'}) valid = serializer.is_valid() errors = serializer.errors
Check how DecimalField validates decimal places.
The DecimalField with decimal_places=2 expects at most 2 decimal digits. The input '12.345' has 3 decimal digits, so validation fails with an error about decimal places.
Given this serializer and data:
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField()
age = serializers.IntegerField(min_value=18)
serializer = UserSerializer(data={'username': 'alice', 'age': 17})
serializer.is_valid()
validated = serializer.validated_data
What will be the value of validated?
from rest_framework import serializers class UserSerializer(serializers.Serializer): username = serializers.CharField() age = serializers.IntegerField(min_value=18) serializer = UserSerializer(data={'username': 'alice', 'age': 17}) serializer.is_valid() validated = serializer.validated_data
Think about what happens when is_valid() returns False.
If is_valid() returns False, validated_data is not populated and accessing it raises a ValidationError.
In Django REST Framework serializers, how do you correctly write a custom validation method for the field email?
from rest_framework import serializers class ContactSerializer(serializers.Serializer): email = serializers.EmailField() # Custom validation method here
Field-level validation methods must be named validate_ and accept self and value.
The correct signature for field-level validation is def validate_fieldname(self, value):. Option C follows this pattern. Option C is for object-level validation. Options C and D have incorrect signatures.
Look at this serializer code:
from rest_framework import serializers
class OrderSerializer(serializers.Serializer):
product_id = serializers.IntegerField(read_only=True)
quantity = serializers.IntegerField()
def validate(self, data):
if data['quantity'] > 10 and data['product_id'] == 0:
raise serializers.ValidationError('Invalid order')
return data
serializer = OrderSerializer(data={'quantity': 15})
serializer.is_valid()Why does calling is_valid() raise a KeyError?
from rest_framework import serializers class OrderSerializer(serializers.Serializer): product_id = serializers.IntegerField(read_only=True) quantity = serializers.IntegerField() def validate(self, data): if data['quantity'] > 10 and data['product_id'] == 0: raise serializers.ValidationError('Invalid order') return data serializer = OrderSerializer(data={'quantity': 15}) serializer.is_valid()
Check which fields are required and what keys exist in data inside validate().
The input data lacks 'product_id', but the validate method tries to access data['product_id'] without checking if it exists, causing a KeyError.
In Django REST Framework, when you call serializer.is_valid(), in what order are the following validation methods called?
- Field-level validation methods (e.g.,
validate_) - Object-level validation method (
validate(self, data)) - Built-in field validators
Think about how DRF validates each field before running custom validations.
First, built-in field validators run to check basic constraints. Then, field-level validate_ methods run for custom field validation. Finally, the object-level validate(self, data) method runs for cross-field validation.