Introduction
ViewSets and Routers provide a clean way to define API endpoints.
ViewSet Actions
from rest_framework import viewsets, mixins
from .models import Book
from .serializers import BookSerializer
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
# Provides: list, create, retrieve, update, partial_update, destroy
Custom Actions
class BookViewSet(viewsets.ModelViewSet):
@action(detail=True, methods=["post"])
def publish(self, request, pk=None):
book = self.get_object()
book.published = True
book.save()
return Response({"status": "published"})
@action(detail=False)
def recent(self, request):
recent_books = Book.objects.order_by("-published_date")[:5]
serializer = self.get_serializer(recent_books, many=True)
return Response(serializer.data)
Routers
from rest_framework.routers import DefaultRouter
from .views import BookViewSet
router = DefaultRouter()
router.register(r"books", BookViewSet)
Practice Problems
- Create ModelViewSet
- Add custom actions
- Configure routers
- Implement filtering
- Add nested routes