【后端】【django】Django DRF `@action` 详解:自定义 ViewSet 方法
Django DRF @action
详解:自定义 ViewSet 方法
在 Django REST Framework(DRF)中,@action
装饰器用于为 ViewSet
添加自定义的 API 端点。相比于 update
、create
等默认方法,@action
允许我们定义 更加清晰、语义化 的 API 访问路径,使接口更加易读且符合 RESTful 设计原则。
1. @action
的作用
@action
主要用于 自定义 API 端点,避免滥用 update
、create
等标准方法,使 API 语义更加清晰。例如:
POST /users/{id}/assign_roles/
✅ (自定义用户角色分配接口,语义清晰)POST /users/{id}/change_password/
✅ (单独的修改密码接口)GET /users/{id}/permissions/
✅ (查询用户权限)
2. @action
的基本用法
📌 示例:为用户分配角色
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets, status
from django.contrib.auth.models import Userclass UserViewSet(viewsets.ModelViewSet):queryset = User.objects.all()serializer_class = UserSerializer@action(detail=True, methods=['post'])def assign_roles(self, request, pk=None):"""自定义 API 端点:为用户分配角色- `detail=True` 表示该方法针对单个用户(即 /users/{id}/assign_roles/)- 仅允许 `POST` 方法"""user = self.get_object()roles = request.data.get('roles', [])# 处理角色分配逻辑(假设 UserRole 是用户角色关联表)UserRole.objects.filter(user=user).delete()for role_id in roles:UserRole.objects.create(user=user, role_id=role_id)return Response({"message": "Roles assigned successfully"}, status=status.HTTP_200_OK)
📌 访问路径
方法 | 访问路径 | 说明 |
---|---|---|
POST | /users/{id}/assign_roles/ | 为用户分配角色 |
3. @action
的参数
@action
可以接收多个参数,主要有:
(1)detail=True/False
detail=True
:作用于单个对象,路径格式为/users/{id}/action_name/
detail=False
:作用于集合,路径格式为/users/action_name/
@action(detail=True, methods=['post'])
def assign_roles(self, request, pk=None): """ /users/{id}/assign_roles/ """
@action(detail=False, methods=['get'])
def active_users(self, request): """ /users/active_users/ """active_users = User.objects.filter(is_active=True)serializer = self.get_serializer(active_users, many=True)return Response(serializer.data)
(2)methods=['get', 'post', 'put', 'patch', 'delete']
@action
默认使用 GET
,但可以指定其他方法:
@action(detail=True, methods=['patch'])
def change_password(self, request, pk=None): """ /users/{id}/change_password/ """user = self.get_object()new_password = request.data.get('password')user.set_password(new_password)user.save()return Response({"message": "Password updated"}, status=status.HTTP_200_OK)
(3)permission_classes=[...], authentication_classes=[...]
@action
允许自定义权限和认证策略:
from rest_framework.permissions import IsAdminUser@action(detail=False, methods=['get'], permission_classes=[IsAdminUser])
def admin_users(self, request): """ /users/admin_users/ 仅管理员可访问 """admins = User.objects.filter(is_staff=True)serializer = self.get_serializer(admins, many=True)return Response(serializer.data)
4. @action
与 update
的区别
方法 | 作用 | 访问路径 | 适用场景 |
---|---|---|---|
update | 更新单个用户 | PUT /users/{id}/ | 用户资料更新 |
@action | 自定义操作 | POST /users/{id}/assign_roles/ | 角色分配、修改密码等 |
📌 最佳实践:
- 简单的用户信息更新 → 用
update
- 特定业务操作(如分配角色、修改密码) → 用
@action
5. @action
的最佳实践
✅ (1)单一职责:一个 API 只做一件事
❌ 错误示例(混合多个逻辑):
def update(self, request, pk=None):user = self.get_object()user.username = request.data.get('username', user.username)user.set_password(request.data.get('password'))user.save()
✅ 正确示例(拆分成两个 API):
@action(detail=True, methods=['patch'])
def change_username(self, request, pk=None):user = self.get_object()user.username = request.data.get('username', user.username)user.save()return Response({"message": "Username updated"}, status=status.HTTP_200_OK)@action(detail=True, methods=['patch'])
def change_password(self, request, pk=None):user = self.get_object()user.set_password(request.data.get('password'))user.save()return Response({"message": "Password updated"}, status=status.HTTP_200_OK)
✅ (2)语义化 URL
- 用户更新资料 →
PUT /users/{id}/
- 分配角色 →
POST /users/{id}/assign_roles/
- 查询活跃用户 →
GET /users/active_users/
- 修改密码 →
POST /users/{id}/change_password/
❌ 避免滥用 update
处理多个逻辑!
✅ (3)权限控制
确保敏感操作(如修改密码)有适当的权限:
@action(detail=True, methods=['post'], permission_classes=[IsAuthenticated])
def change_password(self, request, pk=None):""" 只有登录用户才能修改密码 """
6. 总结
@action
适用于自定义 API 端点- 避免滥用
update
,拆分独立逻辑 - 更符合 RESTful 设计,使 API 语义清晰
- 可搭配权限、认证等更灵活
👉 结论:@action
是 DRF 中提升代码可读性和 API 设计的重要工具,建议在特定业务场景下使用! 🚀
相关文章:
【后端】【django】Django DRF `@action` 详解:自定义 ViewSet 方法
Django DRF action 详解:自定义 ViewSet 方法 在 Django REST Framework(DRF)中,action 装饰器用于为 ViewSet 添加自定义的 API 端点。相比于 update、create 等默认方法,action 允许我们定义 更加清晰、语义化 的 A…...
【Vue.js】
一、简介 1、概述 官网GitHub - Vuejs Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 Vue.js作为一个渐进式框架,其设计理…...
SSL 和 TLS 认证
SSL(Secure Sockets Layer,安全套接层)认证是一种用于加密网络通信和验证服务器身份的安全技术。它是TLS(Transport Layer Security,传输层安全协议)的前身,虽然现在大多数应用使用的是TLS&…...
可复用表格组件设计与实现:分页、排序、筛选全功能解析
文章目录 一、组件设计思路1.1 功能需求分析1.2 技术选型 二、组件架构设计2.1 组件结构2.2 数据流设计 三、核心代码实现3.1 基础表格组件3.2 状态管理 四、功能模块实现4.1 分页组件4.2 排序控制4.3 筛选控制 五、性能优化方案5.1 虚拟滚动5.2 防抖筛选 六、完整测试方案6.1 …...
SmartFormat:轻量级文本模板库,轻松替代 string.Format
推荐一个 C# 编写的轻量级文本模板库,可以作为 string.Format 的替代品。 01 项目简介 SmartFormat不仅继承了 string.Format 的功能,还扩展了更多高级特性,例如命名占位符、列表格式化、本地化支持、复数化等。SmartFormat 提供了高性能、…...
【贪心算法4】
力扣452.用最少数量的剪引爆气球 链接: link 思路 这道题的第一想法就是如果气球重叠得越多那么用箭越少,所以先将气球按照开始坐标从小到大排序,遇到有重叠的气球,在重叠区域右边界最小值之前的区域一定需要一支箭,这道题有两…...
ES 使用geo point 查询离目标地址最近的数据
需求描述:项目中需要通过经纬度坐标查询目标地所在的行政区。 解决思路大致有种,使用es和mysql分别查询。 1、使用es进行查询 将带有经纬度坐标的省市区数据存入es中,mappings字段使用geo point类型,索引及查询dsl如下。 geo p…...
CentOS7 服务器安装 Hadoop 和 Hive
CentOS 服务器安装 Hadoop 和 Hive流程 请将以下的路径更换为自己的路径 1. 环境准备 1.1 安装 JDK Hadoop 和 Hive 需要 Java 运行环境,这里安装 OpenJDK 1.8: # 查看 Java 版本 java -version1.2 创建 Hadoop 用户(可选) …...
C语言零基础入门:嵌入式系统开发之旅
C语言零基础入门:嵌入式系统开发之旅 一、引言 嵌入式系统开发是当今科技领域中一个极具魅力和挑战性的方向。从智能家居设备到汽车电子系统,从智能穿戴设备到工业自动化控制,嵌入式系统无处不在。而C语言,作为嵌入式开发中最常…...
【数据分享】1999—2023年地级市地方一般公共预算收支状况数据(科学技术支出/教育支出等)
在之前的文章中,我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据、房地产投资情况和商品房销售面积相关指标数据和社会消费品零售总额和年末金融机构存贷款余额(均可查看之前的文章获…...
直方图(信息学奥赛一本通-1115)
【题目描述】 给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。假设 Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2.....Fmax}里每个数出现的次数。 【输入】 第一行n是数组的大小。…...
基于NXP+FPGA轨道交通人机交互(HMI)和健康管理单元(PHM)解决方案
人机接口 (HMI) 是交互式显示设备,可用于司机和乘务员的交互式信息显示。也可以用于CCTV监视。满足多种接口设备连接的同时,搭载的Linux系统,可以满足客户的定制化需求。 关键特性 触摸式按键位于显示区域周围,耐用性好࿰…...
宇树与智元的崛起:机器人“灵魂”注入的技术密码
目录 机器人运动的基石:大扭矩与平衡术 大扭矩:力量的源泉 平衡术:动态平衡的艺术 从运动到智能:AI学习的“灵魂”注入 强化学习:试错中的成长 模仿学习:站在巨人的肩膀上 数据与知识共享࿱…...
TCP 全连接队列 内核层理解socket
TCP 全连接队列 理解 listen 的第二个参数 int listen(int sockfd, int backlog);backlog 参数表示 全连接队列(accept 队列)的最大长度。 那什么是全连接队列呢? 三次握手 & accept() 处理流程 客户端发送 SYN,服务器收到并…...
成功破解加密机制,研究人员解锁LinuxESXi Akira勒索软件
一位网络安全研究人员成功破解了Akira勒索软件在Linux/ESXi系统中的加密机制,使得受害者无需支付赎金即可恢复数据。 这一突破利用了勒索软件加密方法中的关键漏洞。据研究人员介绍,该恶意软件使用纳秒级的时间戳作为加密过程中的种子,这使其…...
vue2:el-table列中文字前面加icon图标的两种方式
1、文字前面加icon <el-table-column label="姓名" align="left" prop="nickName"><template #default="{ row }"><i v-if="row.sync" class="el-icon-lock"></i><span>{{ row.nic…...
深入探索Android Bitmap:从原理到实战
一、Bitmap 是什么 在 Android 开发中,Bitmap 是极为重要的基石。简单来说,Bitmap 代表位图,是图片在内存里的具体呈现形式 ,任何诸如 JPEG、PNG、WEBP 等格式的图片,一旦被加载到内存中,就会以 Bitmap 对…...
软考计算机知识-流水线
计算机流水线类似工业生产过程的流水线,在同一时间,m个部件进行不同的操作,完成对不同对象的处理。 理解重叠:让不同的指令在时间上重叠地解释。在解释第k条指令的操作完成之前,就可以开始解释第k1条指令。 题1&#…...
【Linux】从互斥原理到C++ RAII封装实践
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
【哈希表与字符串的算法之路:思路与实现】—— LeetCode
文章目录 两数之和面试题01.02.判定是否为字符重排存在重复元素存在重复元素||字母异位词分组最长公共前缀和最长回文子串二进制求和字符串相乘 两数之和 这题的思路很简单,在读完题目之后,便可以想到暴力枚举,直接遍历整个数组两遍即可&…...
rdiff-backup备份
目录 1. 服务器备份知识点 1.1 备份策略 1.2 备份步骤和宝塔面板简介 1.3 CentOS7重要目录 2. 备份工具 2.1 tar -g 备份演示 2. rsync 备份演示 3. rdiff-backup 备份演示 4. 差异和优缺点 3. rdiff-backup安装和使用 3.1 备份命令rdiff-backup 3.2 恢复命令--…...
Netty基础—4.NIO的使用简介一
大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9.NIO优点总结 10.NIO问题总结 1.Buffer缓冲区 (1)Buffer缓冲区的作用 (2)Buffer缓冲区的4个核心概念 (3)使…...
贪心算法简介(greed)
前言: 贪心算法(Greedy Algorithm)是一种在每个决策阶段都选择当前最优解的算法策略,通过局部最优的累积来寻求全局最优解。其本质是"短视"策略,不回溯已做选择。 什么是贪心、如何来理解贪心(个人对贪心的…...
驻场运维服务方案书(Word文件)
目 录 第一章 背景分析 1.1. 项目背景 1.2. 项目目标 1.3. 系统现状 1.3.1. 网络系统 1.3.2. 设备清单梳理 1.3.3. 应用系统 第二章 需求分析及理解 2.1. 在重要日期能保障信息系统安全 2.2. 信息系统可长期安全、持续、稳定的运行 2.3. 提升发现安全问题、解决安全…...
嵌入式硬件--开发工具-AD使用常用操作
ad16.1.12 1.如何显示/隐藏其他图层 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 not in single layer mode 在pcb界面点击L--试图界面中找到“视图选项”--单层模式选择 gray scale other layers 【Altium】AD如何只显示一层,隐藏其他层显示&…...
在 Ubuntu 上安装和配置 Docker 的完整指南
Docker 是一个开源的平台,旨在简化应用程序的开发、部署和运行。通过将应用程序及其依赖项打包到容器中,Docker 确保应用程序可以在任何环境中一致地运行。 目录 前言安装前的准备安装 Docker 步骤 1:更新包索引步骤 2:安装必要…...
微服务全局ID方案汇总
自增id 对于大多数系统来说,使用mysql的自增id当作主键再最合适不过了。在数据库层面就可以获取一个顺序的、唯一的、空间占用少的id。 自增id需要是 int、bigint这些整数类型,uint 支持 40 亿的数据量,bigint unsign(0 &#x…...
实验5 逻辑回归
实验5 逻辑回归 【实验目的】掌握逻辑回归算法 【实验内容】处理样本,使用逻辑回归算法进行参数估计,并画出分类边界 【实验要求】写明实验步骤,必要时补充截图 1、参照“2.1梯度下降法实现线性逻辑回归.ipynb”和“2.2 sklearn实现线性逻辑…...
【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]
1 起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改掉默认的配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向…...
Linux 下 MySQL 8 搭建教程
一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL: rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件: [roo…...
vue 仿deepseek前端开发一个对话界面
后端:调用deepseek的api,所以返回数据格式和deepseek相同 {"model": "DeepSeek-R1-Distill-Qwen-1.5B", "choices": [{"index": 0, "delta": {"role": "assistant", "cont…...
MinIO问题总结(持续更新)
目录 Q: 之前使用正常,突然使用空间为0B,上传文件也是0B(部署在k8s中)Q: 无法上传大文件参考yaml Q: 之前使用正常,突然使用空间为0B,上传文件也是0B(部署在k8s中) A: 1、检查pod状态…...
STM32配套程序接线图
1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…...
深入理解Linux网络随笔(七):容器网络虚拟化--Veth设备对
深入理解Linux网络随笔(七):容器网络虚拟化 微服务架构中服务被拆分成多个独立的容器,docker网络虚拟化的核心技术为:Veth设备对、Network Namespace、Bridg。 Veth设备对 veth设备是一种 成对 出现的虚拟网络接口&…...
实战指南:鸿蒙ArkTS中实现列表下拉刷新与触底加载的完整解析
前言: 在移动应用开发中,下拉刷新和触底加载更多是提升用户体验的核心功能。鸿蒙ArkUI框架通过Refresh组件和List组件的onReachEnd事件,为开发者提供了简洁高效的实现方案。本文将通过代码示例,详解如何利用ArkTS实现这两个功能。…...
【栈数据结构应用解析:常见算法题详细解答】—— Leetcode
文章目录 栈的模拟实现删除字符串中的所有相邻重复项比较含退格的字符串基本计算器||字符串解码验证栈序列 栈的模拟实现 #include <iostream>using namespace std;const int N 1e5 10;// 创建栈 int stk[N], n;// 进栈 - 本质就是顺序表里面的尾插 void push(int x) …...
Git常用操作之GitLab
Git常用操作之GitLab 小薛博客官网:小薛博客Git常用操作之GitLab官方地址 1、GitLab安装 https://gitlab.cn/install/ 1、Docker安装GitLab https://docs.gitlab.cn/jh/install/docker.html 1、设置卷位置 在设置其他所有内容之前,请配置一个新的…...
2025探索短剧行业新可能报告40+份汇总解读|附PDF下载
原文链接:https://tecdat.cn/?p41043 近年来,短剧以其紧凑的剧情、碎片化的观看体验,迅速吸引了大量用户。百度作为互联网巨头,在短剧领域积极布局。从早期建立行业专属模型冷启动,到如今构建完整的商业生态…...
各省水资源平台 水资源遥测终端机都用什么协议
各个省水资源平台 水资源遥测终端机 的建设大部分从2012年开始启动,经过多年建设,基本都已经形成了稳定的通讯要求;河北瑾航科技 遥测终端机,兼容了大部分省市的通讯协议,如果需要,可以咨询和互相学习&…...
C#+EF+SqlServer性能优化笔记
文章目录 前言一、C#EF 代码优化1.接口代码改异步2.查询异步,只查询需要的数据3.查询数据判断时4.直接使用sql查询 二、数据库优化1.减少关联表,一些基础数据,字典表可以考虑放到redis中,在代码中映射2.增加索引,删除无…...
列表动态列处理
1、在initialize()方法里,获取列表控件,添加CreateListColumnsListener监听 public void initialize(){ BillList billlist(BillList)this.getControl("billlistap"); billlist.addCreateListColumnsListener(this::beforeCreateListColumns)…...
电机控制常见面试问题(十二)
文章目录 一.电机锁相环1.理解锁相环2.电机控制中的锁相环应用3.数字锁相环(DPLL) vs 模拟锁相环(APLL)4.锁相环设计的关键技术挑战5.总结 二、磁链观测1.什么是磁链?2.为什么要观测磁链?3.怎么观测磁链&am…...
芯驿电子 ALINX 亮相德国纽伦堡,Embedded World 2025 精彩回顾
2025年3月13日,全球规模最大的嵌入式行业盛会——德国纽伦堡国际嵌入式展(embedded world 2025)圆满落幕。 在这场汇聚全球 950 家展商、3 万余专业观众的科技盛宴中,芯驿电子 ALINX 展位人头攒动,多款尖端产品吸引客户…...
西门子S7-1200 PLC远程上下载程序方案
西门子S7-1200 PLC远程上下载程序方案(巨控GRM552YW-C模块) 三步完成配置 | 全球适用 | 稳定高效 三步快速完成远程配置 硬件部署 准备巨控GRM552YW-CHE模块1台,通过网口连接西门子S7-1200 PLC以太网口。 模块支持4G/5G/Wi-Fi/网线接入外网…...
MFC窗口的创建/消息映射机制
mfc.h #include<afxwin.h>//mfc头文件//应用程序类 class MyApp:public CWinApp //继承于应用程序类 { public://程序入口virtual BOOL InitInstance(); };//框架类 class MyFrame:public CFrameWnd { public:MyFrame();//声明宏 提供消息映射机制DECLARE_MESSAGE_MAP()…...
【每日学点HarmonyOS Next知识】tab对齐、相对布局、自定义弹窗全屏、动画集合、回到桌面
1、HarmonyOS Tabs 是否能支持 tabbar 居左对齐? 当前方案为自定义tabbar实现,示例demo: Entry Component struct TabsExample {State tabArray: Array<number> [0, 1,2]State focusIndex: number 0State pre: number 0State inde…...
如何在TikTok网页版切换地区设置
今天我们来聊聊如何在TikTok网页版上更改地区设置。TikTok作为全球知名的短视频社交应用,不仅仅局限于某个国家或地区。修改地区设置可以让你探索来自不同地方的内容,享受更为丰富的社交互动体验。那么,具体该如何操作呢?让我一步…...
redis工具类
前言 Redis 是一个高性能的键值存储系统,广泛应用于缓存、消息队列、实时分析等场景。为了更高效地操作 Redis,许多开发者会选择使用 Redisson 客户端库。 依赖配置 首先确保您的项目中已经包含了 Redisson 的最新版本(如 3.44.0ÿ…...
【Python办公】Excel通用匹配工具(双表互匹)
目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动化专…...
安徽省青少年信息学奥林匹克竞赛初中组第1题LuoguP762
先放题目: 【题目背景】.你 .可 .以 .选 .择 .跳 .过 .背 .景 .部 .分。初春的一天,正是乍暖还寒时候,狂风乍起。小可可裹紧了单薄的外衣,往小雪家中赶去。“今天真不是个出门的时候啊!”小可可感叹道。“但是我还有东西要买………...