美文网首页
DRF使用篇(九):视图集

DRF使用篇(九):视图集

作者: 是立品啊 | 来源:发表于2021-01-19 18:01 被阅读0次
    • 类视图继承自ViewSet, ViewSet内已经封装好了相应的处理方法
    class StudentInfoViewSet(viewsets.ViewSet):
    
        def list(self, request):
        ...
    
        def retrieve(self, request, pk=None):
        ...
    
    • ViewSet视图集类不再实现get(),post()等方法,而是实现动作:
    list() 提供一组数据
    retrieve() 提供单个数据
    create() 创建数据
    update() 保存数据
    destory() 删除数据
    
    • 在设置路由时需要将请求方式与动作组织映射: 在as_view中

      • 注意! 如果动作中是对单一对象进行增(put), 删(destory), 改(partial_update), 查(retrieve), 则需要在路径中传入'PK'值
    urlpatterns = [
    url(r'^students/$', StudentInfoViewSet.as_view({'get':'list'}),
    url(r'^students/(?P<pk>\d+)/$', StudentInfoViewSet.as_view({'get': 'retrieve'}) # 需要路径中增加 关键词参数
    ]
    

    ViewSet中的action属性

    • 在视图集中, action对象属性里面存放的时Request对象由 请求方式->映射成请求动作
    • 在视图集内部 重写一些方法时可以根据不同的action(动作) 进行不同的业务处理
    Demo
    def get_serializer_class(self): # 重写了 得到序列化器对象的方法
        if self.action == 'create': # 如果请求的动作是create(post请求),则xxx逻辑
            return OrderCommitSerializer
        else:
            return OrderDataSerializer
    

    ViewSet中自定义动作

    • 自定义动作使用rest_framework.decorators.action装饰器
    • 自定义的动作名称与方法的名字一样,比如定义了自定义的方法名是 'test1' 那么映射的时候,改方法名字对应的动作名也是 ' test1'
    • 装饰器会接收两个参数:
      • methods: 该action支持的请求方式,列表传递
      • detail: 表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键):
        • True 表示使用通过URL获取的主键对应的数据对象
        • False 表示不使用URL获取主键
    Demo
        # 学生信息的修改
        @action(methods=['put'], detail=True)
        def info(self, request, pk):
            # # 根据pk 得到一个数据库的对象
            # instance = super().get_object()
            #
            # # 修改info 只需要一个简单的序列化器即可
            # self.serializer_class = student_info_serializer
            # info_valid = super().get_serializer(instance,data=request.data)
            # info_valid.is_valid(raise_exception=True)
            # info_valid.save()
            # return Response(info_valid.data)
    
            # 另一种方式
            self.serializer_class = student_info_serializer
            instance = self.get_object() # 根据pk得到一个序列化器对象
            order_valid = self.get_serializer(instance, request.data) # 根据数据库u第项得到一个序列化器对象
            order_valid.is_valid() # 数据校验
            order_valid.save() # 数据保存
            return Response(order_valid.data) # 返回前端
    

    常用视图集父类

    ViewSet

    • 继承自APIView,作用也与APIView基本类似, 提供了身份认证、权限校验、流量管理等
    • ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法

    GenericViewSet

    • 继承自GenericAPIView, 作用也与GenericAPIVIew类似, 提供了get_object, get_queryset等方法便于列表视图与详情信息视图的开发

    ModelViewSet

    • 继承自GenericAPIVIew,同时包括了ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestoryModelMixin

    ReadOnlyModelViewSet

    • 继承自GenericAPIVIew, 同时包括了ListModelMixin,RetrieveModelMixin

    相关文章

      网友评论

          本文标题:DRF使用篇(九):视图集

          本文链接:https://www.haomeiwen.com/subject/lozzcktx.html