๐Ÿ“ Django

DRF Serializers

P
Author
PyLand Team
๐Ÿ“…
Published
30.06.2026
โฑ๏ธ
Reading time
1 min
๐Ÿ‘๏ธ
Views
269
๐ŸŒฟ
Level
Medium

A serializer converts model objects to and from a Python dict and JSON.

ModelSerializer

from rest_framework import serializers
from .models import Task, Project

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['id', 'title', 'status', 'priority', 'created_at']
        read_only_fields = ['id', 'created_at']

Custom Fields

class TaskSerializer(serializers.ModelSerializer):
    owner_name = serializers.SerializerMethodField()
    days_old = serializers.SerializerMethodField()

    class Meta:
        model = Task
        fields = ['id', 'title', 'owner_name', 'days_old']

    def get_owner_name(self, obj):
        return obj.owner.get_full_name() if obj.owner else None

    def get_days_old(self, obj):
        from django.utils import timezone
        delta = timezone.now() - obj.created_at
        return delta.days

Nested Serializers

class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Project
        fields = ['id', 'name']

class TaskSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)
    project_id = serializers.PrimaryKeyRelatedField(
        queryset=Project.objects.all(),
        source='project',
        write_only=True,
    )

    class Meta:
        model = Task
        fields = ['id', 'title', 'project', 'project_id']

Validation

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ['title', 'priority']

    def validate_priority(self, value):
        if value < 0 or value > 10:
            raise serializers.ValidationError("Priority must be between 0 and 10")
        return value

    def validate(self, attrs):
        if attrs.get('status') == 'done' and not attrs.get('title'):
            raise serializers.ValidationError("A completed task must have a title")
        return attrs

Usage in a View

# Reading (serialization)
serializer = TaskSerializer(task)
data = serializer.data  # dict

# List
serializer = TaskSerializer(tasks, many=True)

# Writing (deserialization)
serializer = TaskSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
    task = serializer.save(owner=request.user)

# Update
serializer = TaskSerializer(task, data=request.data, partial=True)

Your reaction to the article

๐Ÿ’ฌ Comments (0)

๐Ÿ” Sign in to leave a comment
๐Ÿšช Login
๐Ÿ’ญ

No comments yet

Be the first to share your opinion about this article!

๐Ÿ”— Similar

Similar articles

Continue learning with these materials

๐Ÿ“

Search in Django

You can start with simple Django ORM filters and move to PostgreSQL features when you...

๐Ÿ“… 30.06.2026 ๐Ÿ‘๏ธ 279
๐Ÿ“

Swagger Documentation with drf-spectacular

drf-spectacular generates an OpenAPI 3.0 schema and Swagger UI for DRF.

๐Ÿ“… 30.06.2026 ๐Ÿ‘๏ธ 561
๐Ÿ“

settings.py: Django Configuration

settings.py is the central configuration file for a Django project.

๐Ÿ“… 30.06.2026 ๐Ÿ‘๏ธ 315

Did you like the article?

Subscribe to our updates and be the first to receive new articles. Grow with PyLand!