Implementing RESTful APIs with DRF View Classes and Mixins

Core View Base Classes

DRF provides two fundamental view base classes:

  • APIView: The top-level parent class for all DRF views
  • GenericAPIView: Extends APIView with 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 requests
  • ListModelMixin: Handles GET all requests
  • RetrieveModelMixin: Handles GET single requests
  • UpdateModelMixin: Handles PUT/PATCH requests
  • DestroyModelMixin: 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:

  1. CreateAPIView
  2. ListAPIView
  3. RetrieveAPIView
  4. DestroyAPIView
  5. UpdateAPIView
  6. ListCreateAPIView
  7. RetrieveUpdateAPIView
  8. RetrieveDestroyAPIView
  9. RetrieveUpdateDestroyAPIView
# 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 queryset
  • serializer_class: Specifies the serializer
  • lookup_field: Customizes the lookup parameter (defaults to 'pk')
  • get_queryset(): Returns the queryset (can be overridden)
  • get_serializer(): Returns the serializer intsance
  • get_object(): Retrieves a single model instance

Tags: Django DRF REST API views

Posted on Sat, 17 Oct 2026 16:37:18 +0000 by mananx