DRF的视图组件

DRF的视图组件

DRF的视图组件大概分以下几类

两大视图类

  • APIView、GenericAPIView
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
    '''
    APIView继承Django的View
       1) View:将请求方式与视图类的同名方法建立映射,完成请求响应
       2) APView:除了拥有View的功能之外,还有一些独有的功能
            View的功能;
            重写as_view禁用csrf认证;
            重写dispatch:请求、响应、渲染、异常、解析、三大认证
            多了一堆类属性,可以完成视图类的局部配置
    '''
# GenericAPIView提供了三个方法:get_object()、get_queryset()、get_serializer()

from rest_framework.generics import GenericAPIView
class StudentGenericAPIView(GenericAPIView):
    queryset = models.Student.objects.all()     # 取到所有的学生对象,取到的是一个queryset对象,其实用这些工具我们至少都要定义一个queryset和一个serializer_class
    serializer_class = serializers.StudentModelSerializer       # 

    def get(self, request, *args, **kwargs):
        stu_query = self.get_queryset()
        stu_ser = self.get_serializer(stu_query, many=True)
        return Response(stu_ser.data)

六大视图工具类

  • RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin五大工具类

  • 六大工具方法:retrieve、list、create、update、partial_update、destroy

  •   from rest_framework import mixins 
    

class StudentMixinGenericAPIView(mixins.ListModelMixin, mixins.CreateModelMixin, GenericAPIView):
queryset = models.Student.objects.all()
serializer_class = serializers.StudentModelSerializer

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)
```

九大工具视图类

  • CreateAPIView, DestroyAPIView, ListAPIView, ListCreateAPIView, RetrieveAPIView, RetrieveDestroyAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView, UpdateAPIView

  •   from rest_framework.generics import CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView
    
    
      class StudentMixinAPIView(CreateAPIView, RetrieveAPIView, ListAPIView, UpdateAPIView, DestroyAPIView):
          queryset = models.Student.objects.all()
          serializer_class = serializers.StudentModelSerializer
          # url中单查,不一定必须提供主键,下面的定义就是提供一个供查询的唯一键的字段名即可,当然,需要时表中有的字段,或者是外键字段
          lookup_url_kwarg = 'id'
    
          # 有删除需求的接口继承DestroyAPIView,重写destroy完成字段删除,但其实这个方法没有太大必要,因为这种删除需求会彻底在库中删除数据,而在生产中我们一般只会给is_delet字段修改值而已,所以不需要这个方法,重写的时候只需要修改is_delete字段就好
          def destroy(self, request, *args, **kwargs):
              pass
    

两大视图集基类

  • ViewSet, GenerivViewSet

  •   from rest_framework.viewsets import ModelViewSet
      # 实际上ModelViewSet的源码里面是这么定义的,就是直接继承的mixins(视图工具类)里面的各种方法,几乎包含了所有的方法,除此之外还有一个仅用只读的Model视图集,名为ReadOnlyModelViewSet,
    class ModelViewSet(mixins.CreateModelMixin,
                         mixins.RetrieveModelMixin,
                         mixins.UpdateModelMixin,
                         mixins.DestroyModelMixin,
                         mixins.ListModelMixin,
                         GenericViewSet):
          pass
      # 该类只继承了单查和群查,所以
      class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                                 mixins.ListModelMixin,
                                 GenericViewSet):
          pass
    
      # 而两大大视图集基类均是继承自ViewSetMixin
      class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
          '''
          可以自定义映射关系的GenericAPIView
    
          '''
          pass
      class ViewSet(ViewSetMixin, views.APIView):
          '''
          可以自定义映射关系的APIView
          '''
          pass
      '''
      ViewSetMixin所完成的主要功能就是重写as_view()和view(),从而在url里面可以这样写映射关系,比如
      as_view({
          'get':'my_get',
          'post':'my_post',
    
          })
          这样映射关系写过之后,前端发来的url的类型get和post就会映射到视图层的my_get和my_post,这两个方法都是写在View.py的响应方法里面
      '''

猜你喜欢

转载自www.cnblogs.com/Xu-PR/p/11937799.html