在dispatch过程中,下列属性可用于 ViewSet :
basename - 根url路径
action - 当前动作类型(例如 list , create ).
detail - 用于指示当前动作是针对一个列表还是一个对象detail的布尔指示器
suffix - viewset类型的前缀
name - viewset的名字
description - 详细描述
 
#可以用上面的属性做一些展示和跳转,例如
def get_func(self):
# 通过action判断动作类型
if self.action == 'list':
'''get请求操作'''
else:
'''其他请求操作'''
 
VeiwSet视图集中,如果我们需要被路由用的额外方法,可以使用@action装饰器进行标记
# 导包
from rest_framework.decorators import action @action()装饰器参数
methods: 该action支持的请求方式,列表传递
detail: 表示是action中要处理的是否是视图资源的对象(即是否通过url路径获取主键)
True 表示使用通过URL获取的字段对应的数据对象
False 表示不使用URL获取字段
#示例 post请求  url路由: <int:pk>/set_password
from rest_framework.decorators import action
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=True, methods=['post'])
def set_password(self, request, pk=None): # 定义pk=None
'''
detail=True,从路由中获取pk字段。假设pk=test
那么操作路径为 .../test/set_password
'''
user = self.get_object()
serializer = PasswordSerializer(data=request.data)
if serializer.is_valid():
user.set_password(serializer.data['password'])
user.save()
return Response({'status': 'password set'})
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
#示例 put和post请求 url路由:.../set_password
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=False, methods=['post','put'])
def set_password(self, request):
'''
detail=False,不从url中获取字段
'''
user = self.get_object()
serializer = PasswordSerializer(data=request.data)
if serializer.is_valid():
user.set_password(serializer.data['password'])
user.save()
return Response({'status': 'password set'})
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
 
# action装饰器中也可以加其他额外参数,例如权限、限流等等

# 示例 增加权限验证
@action(detail=False, methods=['post','put'],permission_classes = [isAdminOrIsSelf])
def set_password(self, request):
 
小结
ViewSet
ViewSet 继承自 views.APIView 。可以使用任何父类属性,
如 permission_classes , authentication_classes 以便控制视图集上的 API 策略。
ViewSet 类不提供任何操作的实现。使用 ViewSet 类,需要重写该类并显式地定义动作实现。
GenericViewSet
GenericViewSet 类继承 GenericAPIView
并提供 get_object ,get_queryset 方法和其他通用视图基本行为的默认配置,但默认情况不包括任何操作
ModelViewSet
ModelViewSet 又继承了 GenericAPIView ,但实现了基本的HTTP请求方法。
它提供 .list() , .retrieve() , .create() , .update() , .partial_update()和 .destroy() 操作。
这是我们真正使用的类,使用时至少需要提供queryset 和 serializer_class 属性的值。
可以使用父类GenericAPIView所有的方法
ReadOnlyModelViewSet
ReadOnlyModelViewSet 也继承 GenericAPIView 。与 ModelViewSet 相同的是,它也包
括一些动作的实现。不同的是但是只提供只读的 .list() 和 .retrieve() 动作
 

26.ViewSet和action的更多相关文章

  1. 记使用aliyun-log-logback-appender 报错no applicable action for [encoder], current ElementPath is [[configuration][appender][encoder]]

    依赖: <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliy ...

  2. Struct2_定义拦截器并使用注解方式作用在Action的方法中

    一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问   二.方式:利用拦截器判断用户是否登陆   三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 1 ...

  3. 003. Asp.Net Routing与MVC 之一: 请求如何到达MVC

    基础知识 本文用到的基础知识:URL.HttpModule 与 HttpHandler.IIS 的请求处理过程. URL HttpModule与HttpHandler IIS7.0的请求处理过程 OK ...

  4. 【故障处理】告警日志报“ORA-01565 Unable To open Spfile”

    [故障处理]告警日志报"ORA-01565 Unable To open Spfile" 1.1  BLOG文档结构图 1.2  故障分析及解决过程 1.2.1  故障环境介绍 项 ...

  5. Android--JUnit单元测试

      Android--JUnit单元测试 前言 本篇博客说明一下在Android开发中,如何使用JUnit进行单元测试.首先来了解一下什么是JUnit,JUnit测试是白盒测试,即主要是程序员自己对开 ...

  6. tunnel.p4

    Tunneling: VXLAN and NVGRE (including L2/L3 Gateway), Geneve, GRE and IPinIP /* Copyright 2013-prese ...

  7. Android 异步加载解决方案

    Android的Lazy Load主要体现在网络数据(图片)异步加载.数据库查询.复杂业务逻辑处理以及费时任务操作导致的异步处理等方面.在介绍Android开发过程中,异步处理这个常见的技术问题之前, ...

  8. 【转】Struts2中的MethodFilterInterceptor(转)

    这是一个Struts2.1.8.1应用,代码如下 首先是web.xml文件 view plaincopy to clipboardprint?01.<?xml version="1.0 ...

  9. Android——用户登陆及用户名和密码的保存

    Android——用户登陆及用户名和密码的保存   在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...

随机推荐

  1. vscode 源代码不能自动stage change

    前言 vscode的强大不用赘述了,当你开始使用自然就会爱上他.围绕着IDE的编写体验,有很多强大的自带或者第三方插件,可以做到,编码,git管理,甚至部署一条龙[我司就有这样的插件],让大家沉迷其中 ...

  2. Luogu1655 小朋友的球 (组合数学,第二类斯特林数,高精)

    我bingoyes再高精用STL就饿死,死外边! string真的爽... 斯特林数模板题:\(S(n,m) = S(n-1,m-1)+S(n-1,m)*n\) #include <iostre ...

  3. Luogu1063 能量项链 (区间DP)

    惊恐地发现自己连区间DP都会错2333 #include <iostream> #include <cstdio> #include <cstring> #incl ...

  4. 如何使能512个virtio_blk设备

    一例virtio_blk设备中断占用分析 背景:这个是在客户的centos8.4的环境上复现的,dpu是目前很多 云服务器上的网卡标配了,在云豹的dpu产品测试中,dpu实现的virtio_blk 设 ...

  5. 分库分表之ShardingSphere

    目录 分库分表诞生的前景 分库分表的方式(垂直拆分,水平复制) 1.垂直拆分 1.1 垂直分库 1.2 垂直分表 2.水平拆分 2.1 水平分库 2.2 水平分表 分库分库中间件 ShardingSp ...

  6. Usmjeri(COCI2017.2)题解

    题意 给一棵N个节点的树,编号从1到N,再给定m对点(u,v),你要将树上的每条无向边变为有向边,使得给定的点对都满足u能到达v或v能到达u.问有多少种不同的方案,答案对(1e9+7)求余. 1 ≤ ...

  7. atcoder beginner contest 251(D-E)

    Tasks - Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)\ D - At Most 3 (Contestant ...

  8. 在 C# CLR 中学习 C++ 之了解 namespace

    一:背景 相信大家在分析 dump 时,经常会看到 WKS 和 SRV 这样的字眼,如下代码所示: 00007ffa`778a07b8 coreclr!WKS::gc_heap::segment_st ...

  9. django路由匹配、反向解析、无名有名反向解析、路由分发、名称空间

    目录 django请求生命周期流程图 1.Django请求的生命周期的含义 2.Django请求的生命周期图解及流程 3.Django的请求生命周期(分布解析) 路由层 1.路由匹配 2.path转换 ...

  10. Linux 配置ODBC连接Oracle

    在使用kdb_database_link 扩展插件连接Oracle数据库时,必须先配置ODBC,确保通过ODBC能连接Oracle数据库.以下是配置ODBC的过程. 一.安装ODBC 1.安装 [ro ...