Core View Base Classes
DRF provides two fundamental view base classes:
APIView: The top-level parent class for all DRF viewsGenericAPIView: ExtendsAPIViewwith additional functionality
Basic Implementation with APIView
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
class BookAPIView(APIView):
def get(self, request):
books = Book.objects.all()
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
Enhanced Implementation with GenericAPIView
# views.py
from rest_framework.generics import GenericAPIView
class BookGenericView(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
books = self.get_queryset()
serializer = self.get_serializer(books, many=True)
return Response(serializer.data)
View Mixins for Common Operations
DRF provides five mixins for common CRUD operations:
CreateModelMixin: Handles POST requestsListModelMixin: Handles GET all requestsRetrieveModelMixin: Handles GET single requestsUpdateModelMixin: Handles PUT/PATCH requestsDestroyModelMixin: Handles DELETE requests
# views.py
from rest_framework.mixins import (
CreateModelMixin, ListModelMixin,
RetrieveModelMixin, UpdateModelMixin,
DestroyModelMixin
)
class BookMixinView(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
Pre-built View Subclasses
DRF offers nine pre-configured view subclasses combining mixins:
CreateAPIViewListAPIViewRetrieveAPIViewDestroyAPIViewUpdateAPIViewListCreateAPIViewRetrieveUpdateAPIViewRetrieveDestroyAPIViewRetrieveUpdateDestroyAPIView
# views.py
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
class BookListView(ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
class BookDetailView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
GenericAPIView Key Features
queryset: Defines the model querysetserializer_class: Specifies the serializerlookup_field: Customizes the lookup parameter (defaults to 'pk')get_queryset(): Returns the queryset (can be overridden)get_serializer(): Returns the serializer intsanceget_object(): Retrieves a single model instance