Interview question
Explain APIView vs ViewSets in Django REST Framework. When do you use each? Django REST Framework में APIView बनाम ViewSets को explain करें। कब कौन सा use करते हैं?
Answer
APIView is a low-level class-based view for complete control over request/response handling. ViewSet is a high-level abstraction that automatically generates multiple views (list, create, retrieve, update, delete) from a single class. ViewSets reduce code duplication significantly.
// APIView - Full control, more boilerplate
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
class BookListAPIView(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=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class BookDetailAPIView(APIView):
def get(self, request, pk):
book = Book.objects.get(pk=pk)
serializer = BookSerializer(book)
return Response(serializer.data)
def put(self, request, pk):
book = Book.objects.get(pk=pk)
serializer = BookSerializer(book, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
book = Book.objects.get(pk=pk)
book.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
// urls.py for APIView
urlpatterns = [
path('books/', BookListAPIView.as_view(), name='book-list'),
path('books/<int:pk>/', BookDetailAPIView.as_view(), name='book-detail'),
]
// ViewSet - Less code, automatic CRUD handling
from rest_framework import viewsets
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
# Automatically provides:
# - list (GET /books/)
# - create (POST /books/)
# - retrieve (GET /books/{id}/)
# - update (PUT /books/{id}/)
# - partial_update (PATCH /books/{id}/)
# - destroy (DELETE /books/{id}/)
def get_queryset(self):
# Filter based on query params
queryset = Book.objects.all()
author = self.request.query_params.get('author')
if author:
queryset = queryset.filter(author=author)
return queryset
// urls.py for ViewSet - Router auto-generates URLs
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register(r'books', BookViewSet)
urlpatterns = [
path('', include(router.urls)),
]
// Custom Actions in ViewSet
from rest_framework.decorators import action
class BookViewSet(viewsets.ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
@action(detail=False, methods=['get'])
def recent(self, request):
# GET /books/recent/
recent_books = Book.objects.order_by('-created_at')[:10]
serializer = self.get_serializer(recent_books, many=True)
return Response(serializer.data)
@action(detail=True, methods=['post'])
def mark_featured(self, request, pk=None):
# POST /books/{id}/mark_featured/
book = self.get_object()
book.is_featured = True
book.save()
return Response({'status': 'book marked as featured'})
// When to use each:
// APIView - Complex logic, multiple serializers, custom response formats
// ViewSet - Standard CRUD operations, quick prototyping, REST compliance
// ViewSet Types:
// ModelViewSet - Full CRUD (create, read, update, delete)
// ReadOnlyModelViewSet - List and Retrieve only
// ViewSet - No automatic actions, manual implementationAPIView को full control मिलता है, लेकिन ज्यादा code लिखना पड़ता है। ViewSet automatically CRUD endpoints generate करता है।
Was this answer clear?