@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 装饰器的更多相关文章

  1. 【Django drf】视图层大总结 ViewSetMixin源码分析 路由系统 action装饰器

    目录 九个视图子类 视图集 继承ModelViewSet类写五个接口 继承 ReadOnlyModelView编写2个只读接口 ViewSetMixin源码分析 查找as_view方法 setattr ...

  2. DRF的action装饰器

    1.action装饰器 Django默认的路由分发规则决定了视图函数只能以get.post等请求方式命名,如果想要使用自定义的方式命名,我们可以使用action去映射请求方法名与自定义方法 view. ...

  3. DRF的@action装饰器

    # 转自:http://www.cnblogs.com/zhzhlong/p/9325180.html 视图集中附加action的声明 from rest_framework.decorators i ...

  4. drf-视图集、路由系统、action装饰器

    1.9个视图扩展类 1.两个视图基类:APIView.GenricAPIView 2.5个视图扩展类:CreateModelMixin,UpdateModelMixin,RetrieveModelMi ...

  5. [oldboy-django][2深入django]FBV + CBV + 装饰器

    FBV django CBV & FBV - FBV function basic view a. urls 设置 urls(r'^test.html$', views.test) b. vi ...

  6. Django CBV加装饰器、Django中间件、auth模块

    一. CBV加装饰器 在视图层中,基于函数的视图叫FBV(function base views),基于类的视图叫CBV(class base views).当需要用到装饰器时,例如之前的基于Cook ...

  7. Django之CBV装饰器,跨站请求伪造,auth认证

    CBV加装饰器 基于session实现登录 def login(request): if request.method == 'POST': username = request.POST.get(' ...

  8. django中@property装饰器的运用

    python提供的内置装饰器——staticmethod.classmethod和property 在OSQA中,@property的使用频率是非常高的.下面就是它的使用方法: @property 可 ...

  9. Django CBV方法装饰器

    from django.utils.decorators import method_decorator 1.在post 或 get方法 添加 @method_decorator(装饰器) 2.给类添 ...

  10. django CBV 及其装饰器

    #urls.py from django.contrib import admin from django.urls import path, re_path from app01 import vi ...

随机推荐

  1. 倒计时7天!AIRIOT新品发布会,6月6日北京见。

    随着物联网.大数据.AI技术的成熟和演进,智能物联网技术正在加速.深入渗透至各行业应用. AIRIOT物联网平台作为赋能数字经济发展和产业转型的数字基座,由航天科技控股集团股份有限公司(股票代码:00 ...

  2. FFmpeg Batch AV Converter 2.2.2 官方版

    基本简介 FFmpeg Batch AV Converter官方版是一款Windows FFmpeg用户的前端程序,FFmpeg Batch AV Converter最新版允许使用FFmpeg命令行的 ...

  3. 通过计算巢轻松部署 Walrus

    概述 Walrus 是一个用于管理和部署应用程序的平台,它提供了一个集中化的管理界面,使用户能够轻松地管理应用的生命周期,包括创建.配置.部署.监控和维护应用.Walrus 还提供了一些高级功能,如应 ...

  4. 直播相关-搭建直播流服务器nodejs

    一.安装nodejs环境 去nodejs官方网站下载安装包 https://nodejs.org/en/#download 安装完成之后测试: LUNLI-MC1:~ lunli$ node -v v ...

  5. 7.21考试总结(NOIP模拟22)[d·e·f]

    你驻足于春色中,于那独一无二的春色之中. 前言 首先,这套题的暴力分数十分丰厚,大概是 81+89+30=200 . T1 的特殊性质比较多,也都很好想,于是考场 81pts 是没有问题的. T2 暴 ...

  6. c#WinFrom自定义图表仪表控件-频谱

    这是为客户定制的一个频谱图表控件,先看下成品效果,gif较大,略等片刻 开发步骤分析: 1.界面有多个间距不等的线分割的区域,每个区域的值范围不同,我们就需要把每个区域定义出来,方便我们操作的时候来计 ...

  7. bpmnjs

    在 bpmn.js 中,`bpmnModeler.get()` 方法用于获取不同的模块,你可以通过这些模块来访问和操作 BPMN 模型的不同部分.以下是一些常用的模块和对应的用途: 1. **Canv ...

  8. THUWC 2024 游记

    其实这个游记也没啥好写的-- day 0 上午做动车两个小时到重庆,路上玩了 1.5h 的星露谷. 下午去巴蜀中学报道试机,系统是 Ubuntu Jammy,大大的好评,只是桌面是 Xubuntu/X ...

  9. 手把手教你免费用Flashduty做消息通知

    为什么需要消息通知? 如果有重要的情况发生,希望能通过各种媒介通知我们.可以举几个例子: 家里燃气费没有了,希望能有短信或者app通知 api频繁500报错,希望及时感知,及时修复 公司网站是http ...

  10. ElasticSearch服务Java内存异常分析和排查解决

    ElasticSearch服务Java内存异常分析和排查解决 1.ElasticSearch业务微服务日志排查java.lang.IllegalStateException: Request cann ...