美文网首页
6.drf中各类View

6.drf中各类View

作者: 何阿驼 | 来源:发表于2018-07-22 11:40 被阅读0次

    Rest中的View

    (1)使用Drf中的Serializer

    其他的包

    1531818167128.png

    其中django-guardian是用来写api文档的

    序列化

    之前我们已经讲了如何只使用Python对数据进行序列化显示,这次我们使用drf中的序列化工具

    文档地址:http://www.django-rest-framework.org/tutorial/1-serialization/

    1.创建Serializer类(用来自定义对数据的序列化和反序列化操作)

    1531819281706.png

    首先在view.py同级目录下创建一个Serializer.py文件。

    另外我们应用了drf中的serializer内容

    其中我们只引用了model类中的一个字段name和id,其中read_only是必须要填写的字段,其他的可以看文档

    地址:http://www.django-rest-framework.org/api-guide/fields/

    create是创建数据时所需要的(已经包装好自带)

    update是修改数据时所需要的(已经包装好)

    引用到View中

    我们已经写好了Serializer文件,接下来我们只需要在View中对其进行数据操作就行了


    1531819507545.png 1531819532816.png

    问题

    我们会发现当我们写serializer的时候,他的代码其实和django中的Form表单很相似(样子上很像是),因此他也存在form的问题,就是当我们字段一旦过多,就会出现工作重复量多。在Form中使用了ModelForm简化了这个操作,因此在Serializer也可以使用ModelSerializer简化这些操作

    2.使用ModelSerializer

    文档

    地址:http://www.django-rest-framework.org/tutorial/1-serialization/

    变动

    我们只需要将之前写好的Serializer.py中的内容修改成ModelSerializer就可以了

    1531820075838.png

    fields必须是两个及两个以上

    fields = "____all____" 则表示所有字段

    其实进入源码我们会发现,他已经给我们定义好了create和update,因此他已经可以实现简单的创建和更新,当然如果内容复杂,我们可以重写这两个函数

    1531838804182.png

    嵌套

    由于我们的category是一个外键,他之下还包含了更多的内容

    因此我们只需要重新写一个serializer,并且实例化category就可以了

    1531839111364.png 1531839116988.png

    (2)使用drf中的不同种类的view

    关系

    drf中存在多种多样的View,且不同的View都存在继承上一个View,但最终都继承至django.view,generic中的View

    他们只是继承并添加了不同功能的mixin

    1.APIview

    文档

    地址:http://www.django-rest-framework.org/tutorial/3-class-based-views/

    1.我们之前已经写过Serializer了,因此这里不再写了

    2.对View.py进行操作

    1531817557345.png

    1)这是文档中的一个案例,其中snippets是我们的一个model,这里引入Serializer和model

    2)接下来引入ApiView(看源码我们会发现APIView是继承自View的)

    3)引入rest_framework中的Response (不懂可以看文档第二章http://www.django-rest-framework.org/tutorial/2-requests-and-responses/

    同理,我们对我们的项目也可以这么做

    1531838004489.png
    1531838017547.png

    当然,如果我们需要向django项目一样,在url地址中加入其他的内容,这些函数也可以传入参数


    1531838098705.png
    1531838105960.png

    之后会讲到

    (3)使用Mixins

    Mixins在我看来相当于一个混入的功能模块,每一种Mixins都代表了一种功能或者一些功能

    1531839970985.png

    APIview

    1531840027119.png

    其实ListModelMixin种已经封装了一部分我们在APIview种的代码

    1531840108663.png

    在GenericApiView里面封装了获取serializer名称的方法

    1531840350037.png

    这里只是使用了get方法收集参数并进行传递

    注:如果不写get,会出现错误,因为他会默认你不接受get请求

    (4)使用GengricView

    其实在Generic中已经帮我们定义好了相应的方法,我们只需要调用就可以了

    1531840638285.png 1531840644004.png

    相同的,他还定义了

    1531840659732.png 1531840668613.png

    等等的内容,就是他将mixins功能块封装了起来,我们只需要调用他的View内容就可以了。

    (5)使用ViewSet和路由器

    文档:

    地址:http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/

    什么是ViewSet

    谷歌翻译将他翻译成视图集,即一个通用的视图集合

    实践

    之前我们所用的generics.ListAPIView中


    1531887002002.png

    分别继承了这两个类(GenericAPIView ,以及Mixins.ListModelMixin),这次我们使用ViewSet也需要这样

    首先我们先继承viewsets.GenericViewSet

    1531887091025.png

    我们会发现

    1531887111491.png

    他给我们添加了一个新的Mixin功能,并且继承了GenericAPIView ,但是并没有继承Mixins.ListModelMixin,因此我们还需要添加这个功能(这个功能是用来获取list列表的)


    1531887261480.png

    再来说一说ViewSetMixin这个功能

    1531887373472.png

    他重写了我们的as_view方法

    他将采用字典的形式获取参数(文档中给出了例子)

    因此我们将要修改urls.py中的写法

    1531887829822.png

    当然你也可以这样写

    1531887880023.png

    隐藏Mixins

    1531888008374.png

    其实他也封装好了一些内容来供我们使用

    1531888030549.png

    路由

    我们之前再url中配置了内容,但是频繁的出现get list post create会出现工作量大的可能性,因此这里出现里路由器

    1531888322037.png

    我们只需要将我们的viewSet注册到router中,再调用router.urls来匹配就可以了

    1531888495515.png 1531888507018.png

    总结

    View,ApiView,GengricView,GenericViewSet,Router,Mixin

    在Mixin中一共有5个分别是

    CreateModelMixin(post,增),

    ListModelMixin(get,查),

    RetrieveModelMixin(get,附带参数)

    UpdateModelMixin(put/patch,改)

    DestroyModelMixin(delete,删)

    1531889929757.png

    层级关系

    View是属于django的,

    ApiView继承自View(但他是属于drf中的)

    1531889625702.png 1531889632246.png

    GengricApiView继承自ApiView(属于drf中的)

    并且他是一个父类,所有的增删改查功能继承这个父类之后,再继承一个mixin功能

    1531890147779.png

    GenericViewSet继承自GenericAPIView(属于drf中的),并且添加了一个ViewSetMixin功能(重写了view)

    分别继承了其他的功能后成为了新的viewset

    1531890566393.png

    多使用,多练习

    相关文章

      网友评论

          本文标题:6.drf中各类View

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