ADVERTISEMENT
Google AdSense Slot (headerLeaderboard)

Set your Publisher ID in src/config/ads.ts to display live ads.

Django Tutorial• 9 min read

Building Web APIs with Django REST Framework (DRF)

Serializers, ModelSerializers, ViewSets, and JSON endpoints

Django REST Framework (DRF) is the industry standard toolkit for building powerful, scalable RESTful Web APIs on top of Django models, used by Instagram, Mozilla, and Red Hat.

Serializers and ModelViewSets

Serializers: Translate complex model querysets and Python instances into native JSON payloads, and validate deserialized client requests.

ModelSerializer: Automatically inspects a model to generate matching serializer fields and validators.

ModelViewSet: Combines full CRUD logic (list, create, retrieve, update, destroy) in a single unified class.

DefaultRouter: Automatically maps the ViewSet to standard RESTful URL endpoints.

Complete DRF Endpoint in 20 Lines of Code
# serializers.py
from rest_framework import serializers
from .models import Course

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['id', 'title', 'price', 'category', 'created_at']

# views.py
from rest_framework import viewsets, permissions
from .models import Course
from .serializers import CourseSerializer

class CourseViewSet(viewsets.ModelViewSet):
    queryset = Course.objects.all().order_by('-created_at')
    serializer_class = CourseSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

# urls.py
from rest_framework.routers import DefaultRouter
from .views import CourseViewSet

router = DefaultRouter()
router.register(r'api/courses', CourseViewSet)

urlpatterns = router.urls
The router automatically generates /api/courses/ (GET, POST) and /api/courses/{id}/ (GET, PUT, DELETE).
ADVERTISEMENT
Google AdSense Slot (inContentBanner)

Set your Publisher ID in src/config/ads.ts to display live ads.

Test Yourself With Exercise

+15 XP

Which DRF class automatically generates serializer fields based on an underlying Django model?