Performance: Serializer validation
Serializer validation affects the server response time and user experience by controlling how quickly data is checked and errors are returned before rendering.
Jump into concepts and practice - no test required
class MySerializer(serializers.Serializer): def validate(self, data): item_ids = [item['id'] for item in data.get('items', [])] existing_ids = set(SomeModel.objects.filter(pk__in=item_ids).values_list('pk', flat=True)) if not all(id in existing_ids for id in item_ids): raise serializers.ValidationError('Invalid item') return data
class MySerializer(serializers.Serializer): def validate(self, data): # heavy nested loops and multiple DB queries for item in data.get('items', []): if not SomeModel.objects.filter(pk=item['id']).exists(): raise serializers.ValidationError('Invalid item') return data
| Pattern | DB Queries | Server Processing Time | Response Delay | Verdict |
|---|---|---|---|---|
| Loop with DB query per item | N queries for N items | High | High latency | [X] Bad |
| Batch DB query for all items | 1 query | Low | Low latency | [OK] Good |
email in a serializer?validate_<fieldname>.emailvalidate_email, exactly matching the field name.age is less than 18?
class UserSerializer(serializers.Serializer):
age = serializers.IntegerField()
def validate_age(self, value):
if value < 18:
raise serializers.ValidationError('Must be at least 18')
return value
class ProductSerializer(serializers.Serializer):
price = serializers.FloatField()
def validate(self, data):
if data['price'] < 0:
raise serializers.ValidationError('Price must be positive')
return data
def validate_price(self, value):
if value == 0:
raise serializers.ValidationError('Price cannot be zero')
return value
start_date is before end_date in a serializer. Which is the best way to do this?