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.