Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
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 implementation

APIView को full control मिलता है, लेकिन ज्यादा code लिखना पड़ता है। ViewSet automatically CRUD endpoints generate करता है।

Was this answer clear?