Interview question
What is the difference between Serializer and ModelSerializer in DRF? DRF में Serializer और ModelSerializer में क्या अंतर है?
Answer
Serializer manually defines fields for any data structure. ModelSerializer automatically generates fields from a Django model, saving boilerplate code. ModelSerializer includes automatic validation and save() method implementation.
// Regular Serializer - Manual field definition
from rest_framework import serializers
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(max_length=200)
author = serializers.CharField(max_length=100)
price = serializers.DecimalField(max_digits=10, decimal_places=2)
published_date = serializers.DateField()
def create(self, validated_data):
# Must manually implement create method
return Book.objects.create(**validated_data)
def update(self, instance, validated_data):
# Must manually implement update method
instance.title = validated_data.get('title', instance.title)
instance.author = validated_data.get('author', instance.author)
instance.save()
return instance
// ModelSerializer - Auto-generated from model
from rest_framework import serializers
from .models import Book
class BookModelSerializer(serializers.ModelSerializer):
# Automatically generates all fields from model
# Automatic create() and update() implementation
# Automatic validation based on model fields
class Meta:
model = Book
fields = ['id', 'title', 'author', 'price', 'published_date']
read_only_fields = ['id']
extra_kwargs = {
'title': {'required': True},
'price': {'min_value': 0},
}
// Custom validation in ModelSerializer
class BookModelSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'price', 'published_date']
def validate_title(self, value):
if len(value) < 3:
raise serializers.ValidationError('Title must be at least 3 characters')
return value
def validate(self, data):
# Cross-field validation
if data['price'] < 0:
raise serializers.ValidationError('Price cannot be negative')
return data
// When to use each:
// Serializer - Non-model data, custom structures, API contracts
// ModelSerializer - Model-backed resources, CRUD operations, quick prototyping
// Nested Serializers
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ['id', 'name']
class BookDetailSerializer(serializers.ModelSerializer):
author = AuthorSerializer() # Nested serializer
class Meta:
model = Book
fields = ['id', 'title', 'author', 'price']
// Using custom methods (SerializerMethodField)
class BookWithDetailSerializer(serializers.ModelSerializer):
author_name = serializers.SerializerMethodField()
def get_author_name(self, obj):
return f"{obj.author.first_name} {obj.author.last_name}"
class Meta:
model = Book
fields = ['id', 'title', 'author_name', 'price']Serializer manually define करते हैं, ModelSerializer model से auto-generate होता है। ModelSerializer में create() और update() automatic होते हैं।
Was this answer clear?