As we all know there are 2 types of Views in Django
I will take a quick example to show how the code looks in both the views, I know many of you know this and you can surely skip the below code if you want, but I mainly want to show how ViewSets can help in reducing much of the code.
Function-based Views
@login_required @csrf_exempt def product_list(request): if request.method = "GET": products = Product.objects.all() filtered_products = ProductFilter(request.GET, queryset=products) serializer = ProductSerializer(filtered_products.qs, many=True) return Response({"data": serializer.data, "status": status.HTTP_200_OK}) elif request.method = "POST": data = JSONParser().parse(request) serializer = ProductSerializer(data=data) if serializer.is_valid(): serializer.save() return Response({"data":serializer.data, "status": status.HTTP_201_CREATED}) return Response({"data": serializer.data, "status": status.HTTP_400_BAD_REQUEST})
Class-based Views
class ListProducts(ListCreateAPIView): permission_classes = (IsAuthenticated,) serializer_class = ProductSerializer filter_class = ProductFilter queryset = Product.objects.all() class ProductDetails(RetrieveUpdateDestroyAPIView): permission_classes = (IsAuthenticated,) serializer_class = ProductSerializer queryset = Product.objects.all()
As you can observe things are getting more and more crisp in the form of code.
If we talk about urls.py, the main difference comes when you have to specify Class based Views with as_view() callable function to define them as a View for urls which is not the case with Function based Views.
Implementing ViewSets
Let us now consider the above example for ViewSets.
from rest_framework import viewsets class ProductViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.UpdateModelMixin, mixins.RetrieveModelMixin, mixins.DestropModelMixin, viewsets.GenericViewSet): permission_classes = (IsAuthenticated, ) serializer_class = ProductSerializer queryset = Product.objects.all() filter_class = ProductFilter
Using DefaultRouter for Routing
Now ViewSets bring the concept of a route, we will use DefaultRouter function to instantiate.
from rest_framework.routers import DefaultRouter router = DefaultRouter() # The default routers included with REST framework will # provide routes for a standard set of # create/retrieve/update/destroy style actions router.register('products', ProductViewSet)
Now you can access all the CRUD actions using this single view, and of course, you can override these actions if you want the action to perform any extra data processing.
for more reference to ViewSets you can check the well know DRF link:
That’s it! enjoy!
Also Read: Implementing Two-Factor Authentication in Django Admin Panel