DRF视图集的使用
# 原创,转载请留言联系
如果要把同一种http请求方法的多个接口放在同一个视图中,比如:查询多条数据和一条数据都是get请求,放在同一个视图里,应该怎么做呢???
如果直接放在一起,会怎样呢?
# 视图:
class DepartmentTestView(ListAPIView, RetrieveAPIView):
queryset = Department.objects.all()
serializer_class = DepartmentSerializer # 路由:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^departments$',views.DepartmentTestView.as_view()),
url(r'^departments/(?P<pk>\d+)$',views.DepartmentTestView.as_view())
]
当访问/departments时,匹配对路由,然后到达视图,找get请求的视图,先找到了ListAPIView,执行,正确的返回了数据。
当访问/departments/1时,匹配对路由,然后到达视图,找get请求的视图,先找到ListAPIView,执行,返回了查找全部数据的结果。不是我们想要的结果。
解决办法:使用视图集
1.ViewSet
- 继承自APIView与ViewSetMixin
- 继承ViewSetMixin的作用是实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。
- 在ViewSet中,没有提供任何 action方法,需要我们自己实现 action方法(和继承APIView一样,要自己创建序列化器对象,自己校验数据,自己存数据库,自己序列化等...)
示例:
首先是视图的代码:
class DepartmentViewSet(ViewSet):
def list(self,request):
"""查询全部部门"""
dep = Department.objects.all()
serializer = DepartmentSerializer(instance=dep,many=True)
return Response(data=serializer.data) def create(self,request):
"""新增一个部门"""
data_dict = request.data
serializer = DepartmentSerializer(instance=None,data=data_dict)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data) def retrieve(self,request,pk):
"""查询一个部门"""
try:
dep = Department.objects.get(id=pk)
except Department.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
serializer = DepartmentSerializer(instance=dep)
return Response(serializer.data) def update(self,request,pk):
"""修改一个部门"""
try:
dep = Department.objects.get(id=pk)
except Department.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
data_dict = request.data
serializer = DepartmentSerializer(instance=dep,data=data_dict)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data) def delete(self,request,pk):
"""删除一个部门"""
try:
dep = Department.objects.get(id=pk)
except Department.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
dep.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
然后是路由的配置:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^departments$',views.DepartmentViewSet.as_view({'get':'list','post':'create'})),
url(r'^departments/(?P<pk>\d+)$',views.DepartmentViewSet.as_view({'get':'retrieve','post':'update','delete':'delete'}))
]
注意:
函数名(list、create、retrieve、update、delete)可以自定义的,也可以根据实际情况定义函数。
2.GenericViewSet
- 使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写
- 因为这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法,而Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView
- GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{'get':'list'})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。
示例:
首先是视图的代码:
class DepartmentViewSet(ListModelMixin,CreateModelMixin,RetrieveModelMixin,
UpdateModelMixin,DestroyModelMixin,GenericViewSet): queryset = Department.objects.all()
serializer_class = DepartmentSerializer
然后是路由的配置:
urlpatterns = [
url(r'^departments$',views.DepartmentViewSet.as_view({'get':'list','post':'create'})),
url(r'^departments/(?P<pk>\d+)$',views.DepartmentViewSet.as_view({
'get':'retrieve','put':'update','delete':'destroy'
}))
]
注意:
路由配置中,例如'get':'list',对应的是请求方法,ListModelMixin里面的方法。特别是‘list’,一定要点进类里面,看下方法名是什么,再写在路由里面,不然无法调用类里面的方法,也就返回不了响应对象。
拓展:
如果这几个类满足不了需求,可以仿照ViewSet的方法自定义方法。如果自定义的方法要用到不同的序列话器,可以这样做:
def get_serializer_class(self):
"""修改部门名称的接口,使用不同的序列化器"""
if self.action == '[方法名]':
return [自定义的序列器]
else:
return DepartmentSerializer
3.ModelViewSet
- 继承自
GenericViewSet- 包括了
ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestroyModelMixin- 和第2点的用法一样
4.ReadOnlyModelViewSet
- 继承自
GenericViewSet- 包括了
ListModelMixin、RetrieveModelMixin- 和第2点的用法一样
DRF视图集的使用的更多相关文章
- 使用DRF视图集时自定义action方法
在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...
- DRF视图集的路由设置
在使用DRF视图集时,往往需要配一大堆路由,例如: # views.py class DepartmentViewSet(ListModelMixin,CreateModelMixin,Retriev ...
- 068.Python框架Django之DRF视图集使用
一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- 对drf视图集的理解
视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- DRF中的视图集的使用
1.说明:DRF框架中的视图集: 在drf开发接口中,使用GenericAPIView和视图扩展类结合起来完成接口功能是一件很常见的事情,所以,drf的作者帮我们提前把 GenericAPIView ...
- DRF中五大扩展类及视图集的介绍
五个扩展类 (1)ListModelMixin 列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码. 该Mixin的list方法会对 ...
- drf04 drf视图类
REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...
- day73:drf:drf视图相关类&路由Routers&创建虚拟环境
目录 1.APIView 2.GenericAPIView:通用视图类 3.5个视图扩展类:ListModelMixin,CreateModelMixin,RetrieveModelMixin,Upd ...
- DRF 视图组件
目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...
随机推荐
- DPDK vhost库
原创翻译,转载请注明出处. vhost库实现了一个用户空间的virtio net server,允许用户直接处理virtio ring队列.换句话说,它让用户可以从VM virtio网络设备读取或写入 ...
- Mybatis学习系列(七)缓存机制
Mybatis缓存介绍 MyBatis提供一级缓存和二级缓存机制. 一级缓存是Sqlsession级别的缓存,Sqlsession类的实例对象中有一个hashmap用于缓存数据.不同的Sqlsessi ...
- windows apache启动报错
Windows启动Apache时报错 he requested operation has failed 有可能80端口被占或者项目路径不存在等 首先找到问题原因 cmd--命令端--切换到apach ...
- springboot ueditor 使用心得
1.将ueditor引入项目中会发现,图片不能上传,返回值意思是因配置文件错误,导致图片无法上传 默认情况是使用jsp初始配置文件,这就需要项目支持jsp解析 在maven中引入 <!--添加对 ...
- [剑指Offer] 24.二叉树中和为某一值的路径
[思路] ·递归先序遍历树, 把结点加入路径. ·若该结点是叶子结点则比较当前路径和是否等于期待和. ·弹出结点,每一轮递归返回到父结点时,当前路径也应该回退一个结点 注:路径定义为从树的根结点开始往 ...
- VisualStudio2010项目转换为VisualStudio2005项目:解决方案和工程项目文件转换方法(2)
因为我现在不喜欢把一篇博客写的很长很长,这篇博客是接着上一篇博客来写的.上一篇文章我很详细的说明了修改项目文件解决方案的过程.这篇文章我就说说项目中的项目文件该怎么修改.因为我平日里主要做的是ASP. ...
- js金额转大写数字
//金额转大写数字 const intToChinese = money => { //汉字的数字 let cnNums = new Array('零', '壹', '贰', '叁', '肆', ...
- HDU 5670
Machine Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 单个回调函数中返回多个Request以及Item
import scrapy from myproject.items import MyItem class MySpider(scrapy.Spider): name = 'example.com' ...
- Centos7下redis设置密码、开放远程访问权限
redis的安装与启动可参考前一篇文章:http://www.cnblogs.com/zuidongfeng/p/8032505.html redis安装成功后,默认是没有设置密码的启动redis-c ...