26.ViewSet和action
basename - 根url路径
action - 当前动作类型(例如 list , create ).
detail - 用于指示当前动作是针对一个列表还是一个对象detail的布尔指示器
suffix - viewset类型的前缀
name - viewset的名字
description - 详细描述
#可以用上面的属性做一些展示和跳转,例如
def get_func(self):
# 通过action判断动作类型
if self.action == 'list':
'''get请求操作'''
else:
'''其他请求操作'''
# 导包
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 继承自 views.APIView 。可以使用任何父类属性,
如 permission_classes , authentication_classes 以便控制视图集上的 API 策略。
ViewSet 类不提供任何操作的实现。使用 ViewSet 类,需要重写该类并显式地定义动作实现。
GenericViewSet 类继承 GenericAPIView
并提供 get_object ,get_queryset 方法和其他通用视图基本行为的默认配置,但默认情况不包括任何操作
ModelViewSet 又继承了 GenericAPIView ,但实现了基本的HTTP请求方法。
它提供 .list() , .retrieve() , .create() , .update() , .partial_update()和 .destroy() 操作。
这是我们真正使用的类,使用时至少需要提供queryset 和 serializer_class 属性的值。
可以使用父类GenericAPIView所有的方法
ReadOnlyModelViewSet 也继承 GenericAPIView 。与 ModelViewSet 相同的是,它也包
括一些动作的实现。不同的是但是只提供只读的 .list() 和 .retrieve() 动作
26.ViewSet和action的更多相关文章
- 记使用aliyun-log-logback-appender 报错no applicable action for [encoder], current ElementPath is [[configuration][appender][encoder]]
依赖: <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliy ...
- Struct2_定义拦截器并使用注解方式作用在Action的方法中
一.目的:通过在方法上加注解控制哪些方法需要登陆后才能访问 二.方式:利用拦截器判断用户是否登陆 三.实现步骤 定义配置文件struts.xml添加节点 1 2 3 4 5 6 7 8 9 1 ...
- 003. Asp.Net Routing与MVC 之一: 请求如何到达MVC
基础知识 本文用到的基础知识:URL.HttpModule 与 HttpHandler.IIS 的请求处理过程. URL HttpModule与HttpHandler IIS7.0的请求处理过程 OK ...
- 【故障处理】告警日志报“ORA-01565 Unable To open Spfile”
[故障处理]告警日志报"ORA-01565 Unable To open Spfile" 1.1 BLOG文档结构图 1.2 故障分析及解决过程 1.2.1 故障环境介绍 项 ...
- Android--JUnit单元测试
Android--JUnit单元测试 前言 本篇博客说明一下在Android开发中,如何使用JUnit进行单元测试.首先来了解一下什么是JUnit,JUnit测试是白盒测试,即主要是程序员自己对开 ...
- tunnel.p4
Tunneling: VXLAN and NVGRE (including L2/L3 Gateway), Geneve, GRE and IPinIP /* Copyright 2013-prese ...
- Android 异步加载解决方案
Android的Lazy Load主要体现在网络数据(图片)异步加载.数据库查询.复杂业务逻辑处理以及费时任务操作导致的异步处理等方面.在介绍Android开发过程中,异步处理这个常见的技术问题之前, ...
- 【转】Struts2中的MethodFilterInterceptor(转)
这是一个Struts2.1.8.1应用,代码如下 首先是web.xml文件 view plaincopy to clipboardprint?01.<?xml version="1.0 ...
- Android——用户登陆及用户名和密码的保存
Android——用户登陆及用户名和密码的保存 在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...
随机推荐
- Two---python循环语句/迭代器生成器/yield与return/自定义函数与匿名函数/参数传递
python基础02 条件控制 python条件语句是通过一条或多条语句的执行结果(Ture或者False)来执行的代码块 python中用elif代替了else if,所以if语句的关键字为:if- ...
- Redis 16 哨兵模式
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 主从切换 ...
- 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01
书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...
- 监督学习集成模型——AdaBoost
一.集成学习与Boosting 集成学习是指将多个弱学习器组合成一个强学习器,这个强学习器能取所有弱学习器之所长,达到相对的最佳性能的一种学习范式. 集成学习主要包括Boosting和Bagging两 ...
- ipi发送阻塞导致crash
3.10的内核, 在子进程退出的时候,发送信号通知父进程,此时是持有父进程的sighand中的spinlock的,然后父进程和该子进程不在一个核上,发送ipi的reschedule中断给对应的核, 但 ...
- Spark基础入门(01)—RDD
1,基本概念 RDD(Resilient Distributed Dataset) :弹性分布式数据集 它是Spark中最基本的数据抽象,是编写Spark程序的基础.简单的来讲,一个Spark程序可以 ...
- “判断性别”Demo需求分析和初步设计(中)
大家好~我开设了"深度学习基础班"的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序 线上课程资料: 本节课录像回放 加QQ群,获得 ...
- ABC206 F - Interval Game 2 (区间DP,博弈论,SG函数)
题面 题意很简单 A l i c e \tt Alice Alice 和 B o b \tt Bob Bob 在博弈.摆在他们面前有 N \rm N N 个区间 [ l i , r i ) \rm[l ...
- AtCoder Beginner Contest 265(D-E)
D - Iroha and Haiku (New ABC Edition) 题意: 找一个最少含有三个点的区间,将区间分成三块,三块的和分别为p,q,r,问是否存在这样的区间 题解:先预处理一遍前缀和 ...
- k8s驱逐篇(3)-kubelet节点压力驱逐-源码分析篇
kubelet节点压力驱逐-概述 kubelet监控集群节点的 CPU.内存.磁盘空间和文件系统的inode 等资源,根据kubelet启动参数中的驱逐策略配置,当这些资源中的一个或者多个达到特定的消 ...