Django
Beginner
1 min read
Django REST Framework: Serializers
Example
# blog/serializers.py — DRF serializers
from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import Post, Tag, Category
User = get_user_model()
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ['id', 'name', 'slug']
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email']
class PostSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
tags = TagSerializer(many=True, read_only=True)
tag_ids = serializers.PrimaryKeyRelatedField(
queryset=Tag.objects.all(), many=True, write_only=True, source='tags',
)
url = serializers.SerializerMethodField()
reading_time = serializers.SerializerMethodField()
class Meta:
model = Post
fields = [
'id', 'title', 'slug', 'author', 'category',
'body', 'tags', 'tag_ids', 'status',
'published_at', 'url', 'reading_time',
]
read_only_fields = ['slug', 'published_at']
def get_url(self, obj):
request = self.context.get('request')
return request.build_absolute_uri(f'/api/posts/{obj.pk}/')
def get_reading_time(self, obj):
return max(1, round(len(obj.body.split()) / 200))
def validate_title(self, value):
if len(value) < 5:
raise serializers.ValidationError('Title must be at least 5 characters.')
return value
Related Resources
Django Reference
Complete tag & property list
Django How-To Guides
Step-by-step practical guides
Django Exercises
Practice what you've learned
More in Django