python / intermediate
Snippet
Django REST Framework Custom Serializer Field Validation
This snippet demonstrates Django REST Framework serializer validation techniques. ModelSerializer provides automatic validation, but custom field-level validation offers fine-grained control. The validate_<field> method handles individual field checks, while validate() performs object-level validation across multiple fields. This pattern ensures data integrity before it reaches your database.
snippet.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from rest_framework import serializersfrom .models import Productclass ProductSerializer(serializers.ModelSerializer):price = serializers.DecimalField(max_digits=10,decimal_places=2,min_value=0.01)class Meta:model = Productfields = ['id', 'name', 'price', 'stock']def validate_price(self, value):if value < 0:raise serializers.ValidationError("Price cannot be negative")return valuedef validate_stock(self, value):if value < 0:raise serializers.ValidationError("Stock cannot be negative")return valuedef validate(self, data):if data.get('price') and data.get('stock'):total_value = data['price'] * data['stock']if total_value > 1000000:raise serializers.ValidationError("Total inventory value exceeds limit")return data
django
Breakdown
1
from rest_framework import serializers
Import DRF serializers module for serializer classes
2
price = serializers.DecimalField(...)
Define custom DecimalField with precision limits and minimum value constraint
3
def validate_price(self, value):
Custom field-level validation method for the price field
4
raise serializers.ValidationError(...)
Raise validation error when price is negative
5
def validate(self, data):
Object-level validation method that accesses all fields in data dictionary
6
total_value = data['price'] * data['stock']
Calculate cross-field business rule constraint
7
raise serializers.ValidationError(...)
Reject if total inventory value exceeds business limit