6.drf中各类View

Rest中的View

(1)使用Drf中的Serializer

其他的包

6.drf中各类View_第1张图片
1531818167128.png

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

序列化

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

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

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

6.drf中各类View_第2张图片
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中对其进行数据操作就行了


6.drf中各类View_第3张图片
1531819507545.png
6.drf中各类View_第4张图片
1531819532816.png

问题

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

2.使用ModelSerializer

文档

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

变动

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

6.drf中各类View_第5张图片
1531820075838.png

fields必须是两个及两个以上

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

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

6.drf中各类View_第6张图片
1531838804182.png

嵌套

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

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

6.drf中各类View_第7张图片
1531839111364.png
6.drf中各类View_第8张图片
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进行操作

6.drf中各类View_第9张图片
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/)

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

6.drf中各类View_第10张图片
1531838004489.png

6.drf中各类View_第11张图片
1531838017547.png

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


1531838098705.png

1531838105960.png

之后会讲到

(3)使用Mixins

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

6.drf中各类View_第12张图片
1531839970985.png

APIview

6.drf中各类View_第13张图片
1531840027119.png

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

6.drf中各类View_第14张图片
1531840108663.png

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

6.drf中各类View_第15张图片
1531840350037.png

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

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

(4)使用GengricView

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

6.drf中各类View_第16张图片
1531840638285.png
6.drf中各类View_第17张图片
1531840644004.png

相同的,他还定义了

6.drf中各类View_第18张图片
1531840659732.png
6.drf中各类View_第19张图片
1531840668613.png

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

(5)使用ViewSet和路由器

文档:

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

什么是ViewSet

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

实践

之前我们所用的generics.ListAPIView中


6.drf中各类View_第20张图片
1531887002002.png

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

首先我们先继承viewsets.GenericViewSet

6.drf中各类View_第21张图片
1531887091025.png

我们会发现

6.drf中各类View_第22张图片
1531887111491.png

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


1531887261480.png

再来说一说ViewSetMixin这个功能

6.drf中各类View_第23张图片
1531887373472.png

他重写了我们的as_view方法

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

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

6.drf中各类View_第24张图片
1531887829822.png

当然你也可以这样写

6.drf中各类View_第25张图片
1531887880023.png

隐藏Mixins

6.drf中各类View_第26张图片
1531888008374.png

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

6.drf中各类View_第27张图片
1531888030549.png

路由

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

6.drf中各类View_第28张图片
1531888322037.png

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

1531888495515.png
6.drf中各类View_第29张图片
1531888507018.png

总结

View,ApiView,GengricView,GenericViewSet,Router,Mixin

在Mixin中一共有5个分别是

CreateModelMixin(post,增),

ListModelMixin(get,查),

RetrieveModelMixin(get,附带参数)

UpdateModelMixin(put/patch,改)

DestroyModelMixin(delete,删)

6.drf中各类View_第30张图片
1531889929757.png

层级关系

View是属于django的,

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

1531889625702.png
1531889632246.png

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

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

6.drf中各类View_第31张图片
1531890147779.png

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

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

6.drf中各类View_第32张图片
1531890566393.png

多使用,多练习

你可能感兴趣的:(6.drf中各类View)