Serializers convert complex data (models) to Python dicts/JSON and validate input.
1from rest_framework import serializers2from .models import User, Post34# Basic serializer5class UserSerializer(serializers.ModelSerializer):6 posts_count = serializers.SerializerMethodField()78 class Meta:9 model = User10 fields = ["id", "name", "email", "posts_count"]11 read_only_fields = ["id"]1213 def get_posts_count(self, obj):14 return obj.posts.count()1516# Nested serializer17class PostSerializer(serializers.ModelSerializer):18 author = UserSerializer(read_only=True)19 tags = serializers.SlugRelatedField(20 many=True,21 slug_field="name",22 queryset=Tag.objects.all()23 )2425 class Meta:26 model = Post27 fields = ["id", "title", "content", "author", "tags"]2829# Validation30class CreatePostSerializer(serializers.ModelSerializer):31 class Meta:32 model = Post33 fields = ["title", "content"]3435 def validate_title(self, value):36 if len(value) < 5:37 raise serializers.ValidationError("Title too short")38 return value3940 def validate(self, data):41 if Post.objects.filter(title=data["title"]).exists():42 raise serializers.ValidationError("Title already exists")43 return data4445# Create/Update46 def create(self, validated_data):47 return Post.objects.create(**validated_data)
Field types:
CharField, EmailField, URLField.IntegerField, FloatField, DecimalField.BooleanField, DateTimeField.ListField, DictField.