Django REST Framework: Why APIView is the Most Used and How to Use It Properly
When learning Django REST Framework (DRF), many tutorials and official documentation emphasize GenericAPIView and ViewSet, making it seem like these are the standard approaches. However, in real-world development, APIView is actually the most commonly used class for building APIs.
In this article, we’ll explore the differences between APIView, GenericAPIView, and ViewSet, and explain why APIView is often the best choice.
Three Key Classes in Django REST Framework
There are three primary ways to create APIs in DRF:
APIView(The most basic and flexible class)GenericAPIView(Adds reusable functionalities)ViewSet(Simplifies URL routing)
Let’s dive into their differences.
APIView (The Most Basic and Flexible Class)
APIView is an extension of Django’s View class, designed for building APIs with class-based views (CBVs).
Features
- Explicitly defines
get(),post(),put(),delete(), etc. - Highly customizable
- Can use
querysetandserializer_class, but requires more manual handling thanGenericAPIView - Best suited for simple APIs
Example Code
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import SampleModel
from .serializers import SampleSerializer
class SampleAPIView(APIView):
queryset = SampleModel.objects.all()
def get(self, request):
data = self.queryset.values() # Fetch data using queryset
return Response({"data": list(data)})
def post(self, request):
serializer = SampleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)This example demonstrates how queryset can be used within APIView for data retrieval and serialization.
GenericAPIView (Adds Reusable Functionalities)
GenericAPIView extends APIView by introducing helper methods such as get_queryset() and get_object(), making it easier to handle models and serializers.
Features
- Provides built-in methods for querying and serialization
- Includes
serializer_class,queryset, andget_queryset() - Allows the use of predefined generic views like
ListAPIView,RetrieveAPIView, andCreateAPIView
Example Code
from rest_framework.generics import RetrieveAPIView
from .models import SampleModel
from .serializers import SampleSerializer
class SampleRetrieveAPIView(RetrieveAPIView):
queryset = SampleModel.objects.all()
serializer_class = SampleSerializerThis makes retrieving a single record extremely simple.
ViewSet (Simplifies URL Management)
ViewSet is a further abstraction of GenericAPIView, designed to handle URL routing automatically.
Features
- Includes
ModelViewSetandReadOnlyModelViewSetfor full CRUD functionality - Works seamlessly with
routersto eliminate manual URL definitions - Great for RESTful APIs but can be too rigid for custom logic
Example Code
from rest_framework.viewsets import ModelViewSet
from .models import SampleModel
from .serializers import SampleSerializer
class SampleViewSet(ModelViewSet):
queryset = SampleModel.objects.all()
serializer_class = SampleSerializerWith a router, URL management becomes effortless:
from rest_framework.routers import DefaultRouter
from .views import SampleViewSet
router = DefaultRouter()
router.register(r'samples', SampleViewSet)This automatically generates API endpoints such as:
GET /samples/POST /samples/PUT /samples/{id}/
Why Is APIView the Most Used in Real Projects?
Although APIView, GenericAPIView, and ViewSet each have their strengths, APIView is the most commonly used in real-world applications for several reasons:
Higher Flexibility
APIViewoffers full control over request handling and response formatting.ViewSet, while convenient, abstracts too much, making fine-grained customization difficult.
Simplicity and Readability
- Defining
get(),post(), etc., explicitly makes the code easier to understand. ViewSetautomates API generation, but this can make debugging and customizations harder.
Suitable for Small and Medium APIs
- For simple APIs,
APIViewis sufficient. GenericAPIViewandViewSetare useful for complex, large-scale applications but can be overkill for smaller projects.
Conclusion
In Django REST Framework, APIView is the most commonly used class despite tutorials often favoring ViewSet or GenericAPIView. This can confuse beginners.
- Start with
APIViewto understand how API development works. - Use
GenericAPIViewwhen you need reusable query and serializer handling. - Adopt
ViewSetonly when managing multiple endpoints with a router.
Following this approach ensures a smoother development experience while keeping the codebase manageable.
References


