视图集ViewSet

使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:

  • list() 提供一组数据
  • retrieve() 提供单个数据
  • create() 创建数据
  • update() 保存数据
  • destory() 删除数据

ViewSet视图集类不再实现get()、post()等方法,而是实现动作 action 如 list() 、create() 等。

视图集只在使用as_view()方法的时候,才会将action动作与具体请求方式对应上。如:

class BookInfoViewSet(viewsets.ViewSet):def list(self, request):...def retrieve(self, request, pk=None):...

在设置路由时,我们可以如下操作

urlpatterns = [url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
]

action属性

在视图集中,我们可以通过action对象属性来获取当前请求视图集时的action动作是哪个。

例如:

def get_serializer_class(self):if self.action == 'create':return OrderCommitSerializerelse:return OrderDataSerializer

常用视图集父类

1) ViewSet

继承自APIView,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。

2)GenericViewSet

继承自GenericAPIView,作用也与GenericAPIVIew类似,提供了get_object、get_queryset等方法便于列表视图与详情信息视图的开发。

3)ModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

4)ReadOnlyModelViewSet

继承自GenericAPIVIew,同时包括了ListModelMixin、RetrieveModelMixin。

视图集中定义附加action动作

在视图集中,除了上述默认的方法动作外,还可以添加自定义动作。

添加自定义动作需要使用rest_framework.decorators.action装饰器。

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。

action装饰器可以接收两个参数:

  • methods: 该action支持的请求方式,列表传递
  • detail: 表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
    • True 表示使用通过URL获取的主键对应的数据对象
    • False 表示不使用URL获取主键

举例:

from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.decorators import actionclass BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializer# detail为False 表示不需要处理具体的BookInfo对象
    @action(methods=['get'], detail=False)def latest(self, request):"""返回最新的图书信息"""book = BookInfo.objects.latest('id')serializer = self.get_serializer(book)return Response(serializer.data)# detail为True,表示要处理具体与pk主键对应的BookInfo对象
    @action(methods=['put'], detail=True)def read(self, request, pk):"""修改图书的阅读量数据"""book = self.get_object()book.bread = request.data.get('read')book.save()serializer = self.get_serializer(book)return Response(serializer.data)

url的定义

urlpatterns = [url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
]

视图集的继承关系

路由Routers

对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。

REST framework提供了两个router

  • SimpleRouter
  • DefaultRouter

1. 使用方法

1) 创建router对象,并注册视图集,例如

from rest_framework import routersrouter = routers.SimpleRouter()
router.register(r'books', BookInfoViewSet, base_name='book')

register(prefix, viewset, base_name)

  • prefix 该视图集的路由前缀
  • viewset 视图集
  • base_name 路由名称的前缀

如上述代码会形成的路由如下:

^books/$    name: book-list
^books/{pk}/$   name: book-detail

2)添加路由数据

可以有两种方式:

urlpatterns = [...
]
urlpatterns += router.urls

urlpatterns = [...url(r'^', include(router.urls))
]

2. 视图集中包含附加action的

class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):queryset = BookInfo.objects.all()serializer_class = BookInfoSerializer    @action(methods=['get'], detail=False)def latest(self, request):...    @action(methods=['put'], detail=True)def read(self, request, pk):...

此视图集会形成的路由:

^books/latest/$    name: book-latest
^books/{pk}/read/$  name: book-read

3. 路由router形成URL的方式

1) SimpleRouter

2)DefaultRouter

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

django-视图集ViewSet相关推荐

  1. RESTful之视图集ViewSet

    使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() 保存数据 destor ...

  2. 视图集ViewSet

    2019独角兽企业重金招聘Python工程师标准>>> 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个 ...

  3. Django DRF 视图集

    文章目录 1. ViewSet 2. GenericViewSet 3. ModelViewSet 4. ReadOnlyModelViewSet 5. ViewSetMixin 源码分析 6. 视图 ...

  4. django之视图集

    1.普通视图集 定义视图时需要指明action(行为.动作) 2.模型视图集 # 写分类的视图--模型视图集 class FruitCates(viewsets.ModelViewSet):# 指明操 ...

  5. 第 5 篇:用视图集,简化你的代码

    作者:HelloGitHub-追梦人物[1] 文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库[2] 在 RESTful 架构中,对资源的常规操作无非就是查询.新增.修改.删 ...

  6. Drf从入门到精通五(2个视图基类、5个视图拓展类、9个视图子类、视图集)

    文章目录 一.2个视图基类 1) 基于AIPView写5个接口 2) 基于GenericAPIView写5个接口 二.5个视图拓展类 1) 基于GenericAPIView+5个视图拓展类写接口 三. ...

  7. drf之day05: 2个视图基类,GenericAPIView的属性和方法,基于APIView写5个接口,基于GenericAPIView写5个接口,5个视图扩展类,9个视图子类,视图集

    目录标题 一:2个视图基类 1.GenericAPIView的属性和方法 二:基于APIView写5个接口 三:基于GenericAPIView写5个接口 四:五个视图扩展类 1..基于Generic ...

  8. 快速上手Django(一) 项目结构、开发环境、开发流程、视图、视图集

    文章目录 一.Django 基础 1. django 项目的目录结构 2. 开发环境(Pycharm 启动django) 1)先找到mange.py 2)项目配置远程python解释器 3)点击`ed ...

  9. Django视图层:Django便捷函数,render()函数返回HttpResponse对象,redirect()函数返回HttpResponseRedirect指向传递参数的URL

    一.视图层The view layer Django 具有 "视图" 的概念,负责处理用户的请求并返回响应. 二.render()函数 语法:render(request, tem ...

最新文章

  1. php 云片网对接,php调用云片网接口发送短信的实现方法
  2. 在ORACLE中对存储过程加密
  3. matlab中显示ycbcr图像,rgb到matlab中的ycbcr转换
  4. 状态机设计的一般步骤_浅谈状态机
  5. 有道云笔记语音速记功能体验:让你在移动办公中解放双手
  6. gitlab ssh key
  7. multisim二极管_每日干货——光敏二极管传感器
  8. PXE网刻教程 教如何制作自己的DOS网卡驱动
  9. gg修改器修改数值没有用怎么办_GG修改器修改完成然而被修改数值还是不变。?...
  10. MSN聊天记录显示方式
  11. IT:后端进阶技术路线图(初级→中级→高级)、后端开发工程师(技术方向分类之后台业务开发/中间件/内核/分布式架构)基础知识简介、技术路线/技术趋势指南(如何选择自己的技术方向)之详细攻略
  12. 机器学习预测世界杯球队冠
  13. 2021年危险化学品生产单位安全生产管理人员报名考试及危险化学品生产单位安全生产管理人员模拟考试
  14. 内嵌式js微信扫码登录及自定义样式
  15. 带宽储备能力超100 Tbps,华为云CDN保障平台从容应对流量高峰
  16. 冷月手撕408之计算机组成原理(1)-导学
  17. 机器人是如何自动避障与自主回充的?
  18. JavaScript 日期
  19. mini2440 安装OpenWrt 过程记录
  20. 建站公司服务器管理系统,使用宝塔服务器管理软件为Windows系统服务器快速搭建建站环境...

热门文章

  1. 将正常表格数据转换为横版数据(js实现)
  2. excel表格横向纵向变换_从Python到Excel
  3. BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Mode
  4. php 下载的文件损坏,PHP readfile()导致文件下载损坏
  5. 攻防世界we区newer题目
  6. python 手把手教你基于搜索引擎实现文章查重
  7. Python机器学习建模的标准流程(特征工程+建模调参+模型评估+全流程可视化)
  8. 农场主问题-鸡兔同笼问题---分析与解决--Python
  9. ubuntu磁盘分区方案
  10. 树莓派之常用软件(32位/64位)