Django DRF @action 装饰器
@action
装饰器在Django REST Framework (DRF) 中非常有用,它可以帮助你在ViewSet中创建自定义的动作,而不仅仅是依赖标准的CRUD操作(Create, Read, Update, Delete)。以下是 @action
装饰器的一些常见用法:
1. 创建自定义集合动作
detail=False
表示这个动作是针对整个集合的。例如,你可以创建一个获取所有用户统计信息的动作:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=False, methods=['get'])
def statistics(self, request):
user_count = User.objects.count()
return Response({'user_count': user_count})
2. 创建自定义实例动作
detail=True
表示这个动作是针对单个实例的。例如,你可以创建一个标记用户为活跃的动作:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=True, methods=['post'])
def activate(self, request, pk=None):
user = self.get_object()
user.is_active = True
user.save()
return Response({'status': 'user activated'})
3. 支持多种HTTP方法
你可以指定动作支持的HTTP方法。例如,你可以创建一个既支持GET又支持POST的动作:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=False, methods=['get', 'post'])
def custom_action(self, request):
if request.method == 'GET':
return Response({'message': 'This is a GET request'})
elif request.method == 'POST':
data = request.data
return Response({'message': 'This is a POST request', 'data': data})
4. 指定URL路径和名称
你可以指定自定义动作的URL路径和名称。例如:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=True, methods=['post'], url_path='set-password', url_name='set_password')
def set_password(self, request, pk=None):
user = self.get_object()
new_password = request.data.get('password')
user.set_password(new_password)
user.save()
return Response({'status': 'password set'})
5. 使用权限和认证
你可以为自定义动作设置权限和认证。例如:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework.permissions import IsAuthenticated class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer @action(detail=True, methods=['get'], permission_classes=[IsAuthenticated])
def profile(self, request, pk=None):
user = self.get_object()
serializer = self.get_serializer(user)
return Response(serializer.data)
6. 返回自定义响应
你可以在自定义动作中返回任何类型的响应。例如,文件下载、重定向等:
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets
from django.http import FileResponse class DocumentViewSet(viewsets.ModelViewSet):
queryset = Document.objects.all()
serializer_class = DocumentSerializer @action(detail=True, methods=['get'])
def download(self, request, pk=None):
document = self.get_object()
file_handle = document.file.open()
response = FileResponse(file_handle, content_type='application/pdf')
response['Content-Disposition'] = f'attachment; filename="{document.filename}"'
return response
总结
@action
装饰器为Django REST Framework中的ViewSet提供了极大的灵活性,允许你在标准的CRUD操作之外添加自定义逻辑和功能。这使得你能够创建更加丰富和复杂的API端点,满足具体的业务需求。
Django DRF @action 装饰器的更多相关文章
- 【Django drf】视图层大总结 ViewSetMixin源码分析 路由系统 action装饰器
目录 九个视图子类 视图集 继承ModelViewSet类写五个接口 继承 ReadOnlyModelView编写2个只读接口 ViewSetMixin源码分析 查找as_view方法 setattr ...
- DRF的action装饰器
1.action装饰器 Django默认的路由分发规则决定了视图函数只能以get.post等请求方式命名,如果想要使用自定义的方式命名,我们可以使用action去映射请求方法名与自定义方法 view. ...
- DRF的@action装饰器
# 转自:http://www.cnblogs.com/zhzhlong/p/9325180.html 视图集中附加action的声明 from rest_framework.decorators i ...
- drf-视图集、路由系统、action装饰器
1.9个视图扩展类 1.两个视图基类:APIView.GenricAPIView 2.5个视图扩展类:CreateModelMixin,UpdateModelMixin,RetrieveModelMi ...
- [oldboy-django][2深入django]FBV + CBV + 装饰器
FBV django CBV & FBV - FBV function basic view a. urls 设置 urls(r'^test.html$', views.test) b. vi ...
- Django CBV加装饰器、Django中间件、auth模块
一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...
- Django之CBV装饰器,跨站请求伪造,auth认证
CBV加装饰器 基于session实现登录 def login(request): if request.method == 'POST': username = request.POST.get(' ...
- django中@property装饰器的运用
python提供的内置装饰器——staticmethod.classmethod和property 在OSQA中,@property的使用频率是非常高的.下面就是它的使用方法: @property 可 ...
- Django CBV方法装饰器
from django.utils.decorators import method_decorator 1.在post 或 get方法 添加 @method_decorator(装饰器) 2.给类添 ...
- django CBV 及其装饰器
#urls.py from django.contrib import admin from django.urls import path, re_path from app01 import vi ...
随机推荐
- Asp-Net-Core开发笔记:使用ActionFilterAttribute实现非侵入式的参数校验
前言 在现代应用开发中,确保API的安全性和可靠性至关重要. 面向切面编程(AOP)通过将横切关注点(如验证.日志记录.异常处理)与核心业务逻辑分离,极大地提升了代码的模块化和可维护性. 在ASP.N ...
- k8s master不可以被调度,修改deploy配置让这个可以单独调度上去
给两个节点添加标签,让pod调度上去,但是kubectl describe pod 发现报错了,因为master不可以被调度,kube002也是设置了污点禁止被调度了 Warning FailedS ...
- 使用 Spacesniffer 找回 48G 系统存储空间的总结
前言 Spacesniffer 是一个免费的文件扫描工具,通过使用树状图可视化布局,可以立即了解大文件夹的位置,帮助用户处理找到这些文件夹 当前系统C盘空间 清理后系统C盘空间 下载 Spacesni ...
- Python作图三维等高面
技术背景 对于等高线,大家都是比较熟悉的,因为日常生活中遇到的山体和水面,都可以用一系列的等高线描绘出来.而等高面,顾名思义,就是在三维空间"高度一致"的曲面.当然了,在二维平面上 ...
- Android 13 - Media框架(3)- MediaPlayer生命周期
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节了解了MediaPlayer api的使用,这一节就我们将会了解MediaPlayer的生命周期与api使用细节. 1.MediaPlayer ...
- 使用 OWIN Self-Host ASP.NET Web API 自宿主 Swagger Swashbuckle 在线文档
使用 OWIN Self-Host ASP.NET Web APIhttps://learn.microsoft.com/zh-cn/aspnet/web-api/overview/hosting-a ...
- 【译】使用 .NET Aspire 和 Visual Studio 开发云原生应用
我们很高兴地向大家介绍 .NET Aspire,它旨在简化 .NET 云原生应用程序的构建和管理方式..NET Aspire 为像您这样的开发人员提供了一个改进的.有主见的框架,用于构建分布式应用程序 ...
- Postman POST多个文件
软件做的比较好用,
- NOIP模拟101(多校33)
T1 ladice 解题思路 我们把一个物品看做 \(A_i\) 与 \(B_i\) 之间的连边. 那么如果加入这条边之后联通块中有超过两个环或者两个环就是不合法的,也就是合法的状态只能是一个基环树和 ...
- RHCSA题目大纲
1.配置IP地址2.配置软件仓库3.调试SELinux4.创建用户账户5. 配置cron计划任务6.创建共享目录7.配置NTP时间客户端 "chronyd服务"8. auto自动 ...