Django Lesson 8: Django REST Framework
Django REST Framework (DRF) turns your Django app into a powerful API. Used by Instagram, Mozilla, Red Hat, and thousands more.
pip install djangorestframework
# settings.py
INSTALLED_APPS = [
...
"rest_framework",
]
Serializers + ViewSets
# posts/serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
author_name = serializers.CharField(source="author.username", read_only=True)
class Meta:
model = Post
fields = ["id", "title", "content", "status", "author_name", "created_at"]
read_only_fields = ["id", "created_at", "author_name"]
# posts/views.py
from rest_framework import viewsets, permissions
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.filter(status="published")
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer):
serializer.save(author=self.request.user)
# posts/urls.py
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("posts", PostViewSet)
urlpatterns = router.urls
# Generates: GET/POST /posts/, GET/PUT/DELETE /posts/{id}/
🏋️ Practice Task
Convert your task manager to a DRF API. Create TaskSerializer, ProjectSerializer. Use ModelViewSet for both. Add custom action: POST /tasks/{id}/toggle/ that flips the done status. Visit /api/ for the browsable API.
💡 Hint: @action(detail=True, methods=[“post”]) def toggle(self, request, pk=None): task = self.get_object(); task.done = not task.done; task.save()