Code-Memo

Generic Views

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.

Using Django Rest Framework (DRF) for JSON Responses

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

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

RetrieveAPIView

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

CreateAPIView

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

UpdateAPIView

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

DestroyAPIView

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()

Combining Multiple Actions with ViewSets

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
URL Configuration for ViewSets

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

Customizing Responses

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)