美文网首页
DRF之视图

DRF之视图

作者: 咏远瑞智 | 来源:发表于2018-07-27 17:03 被阅读0次

    DRF框架包含序列化器,视图以及URL视图,三者密不可分,因此本篇聊的是视图部分。在django中rest_framework框架包含的是类视图,类视图区别于函数视图,是将视图封装到类里面,rest_framework框架里面的类视图分为三种视图,一级视图为APIView,二级视图为GenericAPIView,三级视图为ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestoryAPIView.

    三级视图继承二级视图GenericAPIView和mixin扩展类,封装好了get,post,put,delete等方法。Mixin扩展类做了序列化以及反序列化等转换工作,GenericAPIView则是增加了列表和详情视图等通用方法,设置序列化器属性和查询结果集属性。下面是使用三级视图的例子:

    class ThirdAPIView(ListAPIView,CreateAPIView):

       queryset = BookInfo.objects.all()

       serializer_class = BookInfoSerializer

    二级视图继承自一级视图APIView,二级视图增加了列表和详情视图等通用方法,设置序列化器属性和查询结果集属性。使用get_queryset 返回视图查询结果集,get_serializer返回序列化器对象。下面是列表视图。

    class

    SencondGenericAPIView(GenericAPIView):

        #  定义查询结果集和序列化器属性

        queryset = BookInfo.objects.all()

        serializer_class = BookInfoSerializer

         列表视图

        def get(self, request):

            queryset = self.get_queryset()

            serializer =self.get_serializer(queryset, many=True)

            return Response(serializer.data)

        def post(self,request):

            #  获取新增数据

            data=request.data

            # 创建序列化器

           serializer=self.get_serializer(data=data)

            # 校验

            serializer.is_valid()

            serializer.save()

            # 返回响应

            return Response(serializer.data)

    对于详情视图需要使用get_object返回详情视图所需的模型类数据对象。

                #详情视图

        def get(self, request, pk):

            book = self.get_object()

            serializer = self.get_serializer(book)

            return Response(serializer.data)

        def put(self, request, pk):

            book = self.get_object()

            # 获取数据

            data = request.data

            # 传递给序列化器

            serializer =self.get_serializer(instance=book, data=data)

            if serializer.is_valid():

                serializer.save()

                # 返回响应

                return Response(serializer.data)

            else:

                returnResponse(status=status.HTTP_400_BAD_REQUEST)

        def delete(self, request, pk):

            # 获取模型

            book = self.get_object()

            # 删除

            book.delete()

            # 返回响应

            return Response(status=status.HTTP_204_NO_CONTENT)

    一级视图APIView继承自Django中的父类view。与view类似,不同的地方在于他将返回和响应对象进行了封装,Django的view中返回的是HttpRequest与HttpReponse对象,DRF的APIView中返回的是Request和Reponse对象。因为继承的是view,所以在路由进入视图函数后,会调用dispatch()方法中相应的get,post,put,delete等方法,最后返回view的结果给视图函数,视图函数再返回具体的响应。采用request.data接收返回解析之后的请求体数据,类似于Django中标准的request.POST属性。采用request.query_params与Django标准的request.GET相同,获取请求数据。

    响应对象构造方式为Response(data,

    status=None, template_name=None, headers=None, content_type=None),常用的属性:data为响应数据,status为响应状态。

     

    相关文章

      网友评论

          本文标题:DRF之视图

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