Django’s generic views provide a powerful way to quickly build views by using built-in generic view classes. When working with APIs, generic views can be customized to return JSON responses instead of rendering HTML templates.
While Django’s built-in generic views are useful, the Django Rest Framework (DRF) provides additional tools and views specifically designed for building APIs with JSON responses. DRF’s generic views extend Django’s generic views to include serialization and response handling.
ListAPIView is used to retrieve a list of objects and return them as JSON.
from rest_framework.generics import ListAPIView
from .models import Item
from .serializers import ItemSerializer
class ItemListView(ListAPIView):
queryset = Item.objects.all()
serializer_class = ItemSerializer
ItemListView inherits from ListAPIView.queryset defines the set of objects to retrieve.serializer_class specifies the serializer to use for converting objects to JSON.RetrieveAPIView is used to retrieve a single object and return it as JSON.
from rest_framework.generics import RetrieveAPIView
from .models import Item
from .serializers import ItemSerializer
class ItemDetailView(RetrieveAPIView):
queryset = Item.objects.all()
serializer_class = ItemSerializer
ItemDetailView inherits from RetrieveAPIView.CreateAPIView is used to create a new object and return the created object as JSON.
from rest_framework.generics import CreateAPIView
from .models import Item
from .serializers import ItemSerializer
class ItemCreateView(CreateAPIView):
queryset = Item.objects.all()
serializer_class = ItemSerializer
ItemCreateView inherits from CreateAPIView.UpdateAPIView is used to update an existing object and return the updated object as JSON.
from rest_framework.generics import UpdateAPIView
from .models import Item
from .serializers import ItemSerializer
class ItemUpdateView(UpdateAPIView):
queryset = Item.objects.all()
serializer_class = ItemSerializer
ItemUpdateView inherits from UpdateAPIView.DestroyAPIView is used to delete an existing object and return a response indicating the deletion status.
from rest_framework.generics import DestroyAPIView
from .models import Item
class ItemDeleteView(DestroyAPIView):
queryset = Item.objects.all()
ItemDeleteView inherits from DestroyAPIView.DRF’s ViewSet classes allow you to combine multiple actions (list, create, retrieve, update, delete) into a single class.
from rest_framework.viewsets import ModelViewSet
from .models import Item
from .serializers import ItemSerializer
class ItemViewSet(ModelViewSet):
queryset = Item.objects.all()
serializer_class = ItemSerializer
ItemViewSet inherits from ModelViewSet.You can use DRF’s routers to automatically generate URL patterns for viewsets.
from rest_framework.routers import DefaultRouter
from .views import ItemViewSet
router = DefaultRouter()
router.register(r'items', ItemViewSet)
urlpatterns = router.urls
DefaultRouter automatically creates URL patterns for all actions in ItemViewSet.You can customize responses by overriding methods in generic views or viewsets.
from rest_framework.response import Response
from rest_framework.generics import RetrieveAPIView
from .models import Item
from .serializers import ItemSerializer
class CustomItemDetailView(RetrieveAPIView):
queryset = Item.objects.all()
serializer_class = ItemSerializer
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
custom_data = {'data': serializer.data, 'message': 'Custom response message'}
return Response(custom_data)
retrieve method is overridden to customize the response data.