DRF之视图

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为响应状态。

 

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • API Reference GenericAPIView This class extends REST fram...
    阳光小镇少爷阅读 7,430评论 0 1
  • Django: csrf防御机制 csrf攻击过程 1.用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登...
    lijun_m阅读 4,738评论 0 0
  • 基于类的视图的一个主要优点是它们允许你组合可重复使用的行为。 REST框架通过提供大量预构建视图来提供常用模式,从...
    YYL07阅读 3,892评论 0 0
  • 基于类的视图 Django中的视图是一个可调用对象,它接收一个请求然后返回一个响应。这个可调用对象不仅仅限于函数,...
    兰山小亭阅读 10,044评论 1 13
  • 你好 Django REST Framework 在第二章,我们学习了 REST 开发的基本知识,并且在没有借助任...
    ucag阅读 9,963评论 5 16