📝 Django

DRF Serializers

P
Author
Pyland
📅
Published
30.06.2026
⏱️
Reading time
1 min
👁️
Views
79
🌿
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

📝

pytest-django: Testing Django

Охватываемые темы: Installation, @pytest.mark.djangodb, Fixtures, Testing views.

📅 30.06.2026 👁️ 138
📝

Django: Template Tags

Template tags are logic inside HTML. Unlike {{ variable }} which only outputs a value,...

📅 30.06.2026 👁️ 85
📝

Django: Static Files

Static files are CSS, JavaScript, images, and fonts. Django handles them in a specific way:...

📅 30.06.2026 👁️ 75

Did you like the article?

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