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.pngfields必须是两个及两个以上
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.png1)这是文档中的一个案例,其中snippets是我们的一个model,这里引入Serializer和model
2)接下来引入ApiView(看源码我们会发现APIView是继承自View的)
3)引入rest_framework中的Response (不懂可以看文档第二章http://www.django-rest-framework.org/tutorial/2-requests-and-responses/)
同理,我们对我们的项目也可以这么做
1531838004489.png1531838017547.png
当然,如果我们需要向django项目一样,在url地址中加入其他的内容,这些函数也可以传入参数
1531838098705.png
1531838105960.png
之后会讲到
(3)使用Mixins
Mixins在我看来相当于一个混入的功能模块,每一种Mixins都代表了一种功能或者一些功能
1531839970985.pngAPIview
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
1531887373472.png再来说一说ViewSetMixin这个功能
他重写了我们的as_view方法
他将采用字典的形式获取参数(文档中给出了例子)
因此我们将要修改urls.py中的写法
1531887829822.png当然你也可以这样写
1531887880023.png1531888008374.png隐藏Mixins
其实他也封装好了一些内容来供我们使用
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.pngGengricApiView继承自ApiView(属于drf中的)
并且他是一个父类,所有的增删改查功能继承这个父类之后,再继承一个mixin功能
1531890147779.pngGenericViewSet继承自GenericAPIView(属于drf中的),并且添加了一个ViewSetMixin功能(重写了view)
分别继承了其他的功能后成为了新的viewset
1531890566393.png多使用,多练习
网友评论