• 【Django】Django REST Framework接口实现详解:从APIView到ModelViewSet


    Django REST Framework接口实现详解:从APIView到ModelViewSet

    Web开发中,设计RESTful API接口时,Django REST Framework(DRF)是一个非常强大的工具。DRF提供了丰富的类视图(CBV)实现方式,支持从基础的APIView到高度抽象的ModelViewSet等多种接口实现方式。本文将详细介绍不同层次的接口设计,包括基础的APIViewGenericAPIViewMinIN混合类、ViewSet等,帮助开发者更好地理解并应用DRF进行API设计。

    一、基于APIView的接口实现

    APIView基本使用

    APIView是DRF中最基础的类视图,用于实现自定义接口逻辑。我们可以通过继承APIView类,定义接口的GETPOSTDELETE等请求方法,并且灵活地处理请求数据和返回响应。

    from rest_framework.views import APIView
    from django.http import HttpResponse
    
    class BookView(APIView):
        def get(self, request):
            return HttpResponse("APIView GET请求...")
    
        def post(self, request):
            return HttpResponse("APIView POST请求...")
    
        def delete(self, request):
            return HttpResponse("APIView DELETE请求...")
    

    APIView提供了DRF的基础功能,允许开发者在请求到达时处理认证、权限检查等,同时可以对请求数据进行序列化。

    二、基于GenericAPIView的接口实现

    GenericAPIView是DRF中的一个抽象类,它封装了许多常用的功能,比如获取查询集、序列化器等。通过继承GenericAPIView,开发者可以更简洁地编写接口代码,同时保留灵活性。

    from rest_framework.generics import GenericAPIView
    from rest_framework.response import Response
    from .models import Publish
    from .serializers import PublishSerializers
    
    class PublishView(GenericAPIView):
        queryset = Publish.objects.all()
        serializer_class = PublishSerializers
    
        def get(self, request):
            serializer = self.get_serializer(instance=self.get_queryset(), many=True)
            return Response(serializer.data)
    
        def post(self, request):
            serializer = self.get_serializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors)
    

    GenericAPIView可以自动化处理查询集的获取、序列化器的实例化等,极大简化了代码量。

    三、基于MinIN混合类的接口实现

    DRF通过Mixin类提供了一些常用的行为,如列表、创建、更新、删除等。通过组合这些Mixin类,我们可以轻松实现CRUD操作。

    from rest_framework.mixins import ListModelMixin, CreateModelMixin
    from rest_framework.generics import GenericAPIView
    
    class PublishView(ListModelMixin, CreateModelMixin, GenericAPIView):
        queryset = Publish.objects.all()
        serializer_class = PublishSerializers
    
        def get(self, request):
            return self.list(request)
    
        def post(self, request):
            return self.create(request)
    

    这样组合Mixin类的方式,可以快速地实现接口逻辑,同时保留一定的灵活性。

    四、基于ListCreateAPIView的接口实现

    GenericAPIView的基础上,DRF还进一步封装了常用的视图类,比如ListCreateAPIViewRetrieveUpdateDestroyAPIView等。通过继承这些类,我们可以实现完整的增删改查接口。

    from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
    
    class PublishView(ListCreateAPIView):
        queryset = Publish.objects.all()
        serializer_class = PublishSerializers
    
    class PublishDetailView(RetrieveUpdateDestroyAPIView):
        queryset = Publish.objects.all()
        serializer_class = PublishSerializers
    

    这些封装类提供了更加简洁的API接口实现方式。

    五、基于ViewSet的接口实现

    ViewSet重新定义了视图的分发机制,使得同一个视图类可以处理不同类型的请求,像GETPOSTPUT等。

    from rest_framework.viewsets import ViewSet
    from rest_framework.response import Response
    
    class PublishView(ViewSet):
        def get_all(self, request):
            return Response("查看所有资源")
    
        def add_object(self, request):
            return Response("添加资源")
    
        def get_object(self, request, pk):
            return Response("查看单一资源")
    
        def update_object(self, request, pk):
            return Response("更新单一资源")
    
        def delete_object(self, request, pk):
            return Response("删除单一资源")
    

    ViewSet通过路由自动将不同的HTTP请求方法映射到类中的对应方法,极大简化了接口设计。

    六、基于ModelViewSet的接口实现

    ModelViewSet是DRF中功能最强大的视图类,集成了所有Mixin类的功能,能够同时处理列表、详情、创建、更新和删除操作。开发者只需定义模型和序列化器,就可以实现完整的CRUD接口。

    from rest_framework.viewsets import ModelViewSet
    from .models import Publish
    from .serializers import PublishSerializers
    
    class PublishView(ModelViewSet):
        queryset = Publish.objects.all()
        serializer_class = PublishSerializers
    

    ModelViewSet是最具生产力的视图类,适合大多数RESTful API接口的实现场景。

    总结

    在DRF中,接口的实现可以根据需求逐渐封装、抽象。从基础的APIView到高度封装的ModelViewSet,开发者可以灵活选择适合自己项目的实现方式。

  • 相关阅读:
    面试题五:computed的使用
    CSS 中px、em、rem、%、vw、vh单位之间的区别详解【全网最全】
    qt_vs_tools 设置
    Netty 学习(八):新连接接入源码说明
    2024.6.12 作业 xyt
    Spring-03-AOP面向切面编程
    AppLink定时调度操作
    快速删除MySQL服务 。
    【Linux复习汇总】得分秘籍,考前速看,可以多考几分
    Easy EDA #学习笔记09# | ESP32-WROOM-32E模组ESP32-DevKitC-V4开发板 一键下载电路
  • 原文地址:https://blog.csdn.net/linjiuxiansheng/article/details/142153312