Skip to content

Serializers

Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other content types.

They also provide deserialization, validating parsed data before saving it back to complex types.

Creating a basic Serializer

A basic serializer is very similar to a Django Form.

python
from rest_framework import serializers

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

ModelSerializers

Often, your serializers map closely to Django models. The ModelSerializer class provides a shortcut that lets you automatically create a Serializer class with fields that correspond to the Model fields.

python
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
python
from rest_framework import serializers
from .models import Article

class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'body'] 
        # Use fields = '__all__' to include all fields

Validation

You can add custom validation to your serializers using .validate_<field_name> or .validate.

python
class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['title', 'body']

    def validate_title(self, value):
        if 'django' not in value.lower():
            raise serializers.ValidationError("Blog post must be about Django")
        return value