首页 > 其他分享 >Django DRF @action 装饰器

Django DRF @action 装饰器

时间:2024-07-17 12:12:42浏览次数:5  
标签:viewsets rest Django framework action import Response DRF

@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端点,满足具体的业务需求。

标签:viewsets,rest,Django,framework,action,import,Response,DRF
From: https://www.cnblogs.com/beichengshiqiao/p/18307014

相关文章

  • Django使用 DoesNotExist 异常和 Logger 来记录异常情况
     代码不仅处理了特定的异常类型,还可以添加更多的调试信息来帮助诊断问题。可以使用DoesNotExist异常和Logger来记录异常情况。fromdjango.core.exceptionsimportObjectDoesNotExistimportlogginglogger=logging.getLogger(__name__)try:rst=CU009HModel......
  • Django导出EXCEL并确保表头左右两列显示
    以下是导出EXCEL确保表头左右两列显示正确值的代码示例:fromopenpyxlimportWorkbookfromopenpyxl.stylesimportAlignment#创建一个新的工作簿和工作表wb=Workbook()ws=wb.active#模拟订单头信息(替换为您的实际数据获取方法)order_header={'od_no':'SO......
  • Django项目中使用markdown语法
    要让Django项目支持Markdown语言,你可以使用第三方库markdown来转换Markdown文本到HTML。以下是如何在Django项目中集成Markdown支持的步骤:1.安装Markdown库首先,安装Markdown库:pipinstallmarkdown2.在视图中使用Markdown在你的视图函数中,使用Markdown库将Markdown文本转......
  • 【Django】网上蛋糕项目商城-购物车和我的订单功能
    1.购物车功能在首页中的滚动栏的商品,热门商品,新品,以及商品详情中都有加入购物车按钮在models文件中创建购物车表,用于保存当前用户添加的商品信息#购物车表classShoppingCar(models.Model):#用户iduserId=models.IntegerField()#商品idgoodsId=......
  • django实现用户的注册、登录、注销功能
    创建django项目的步骤:Django项目的创建步骤-CSDN博客一、前置工作配置数据库,设置数据库引擎为mysql1、在settings文件中找到DATABASES,配置以下内容DATABASES={"default":{'ENGINE':'django.db.backends.mysql',#数据库引擎'NAME':'dja......
  • 2. DRF 解析器
    目录DjangoDRF解析器1.解析器作用2.使用解析器默认配置为视图类定义解析器修改全局配置DjangoDRF解析器1.解析器作用request请求先进到APIView的dispatch方法,如果有异常走到exception。Json请求www-form请求form-data请求可以看到不同类型的请求,request.data......
  • Django 实践记录
    环境说明:mac11.3.1Django3.2.25python免费版3.7前置-安装python、pycharm(略)创建项目、创建虚拟环境pycharm创建项目、并创建好虚拟环境进入虚拟环境,安装Djangopipinstalldjango创建Django项目进入项目,创建Django项目django-adminstartprojectmyproject.......
  • 在 DjangoStarter 中集成 TailwindCSS
    前言好久没有更新技术文章了这个月开箱和随笔倒是写了不少,又忙又懒的基础的文章不太想写,稍微深入一点的又需要花很多时间来写虽然但是,最终还是想水一篇最近做了一个基于wagtail的项目,有不少东西可以记录。本文先记录一下把tailwindcss支持添加到DjangoStarter框架里使......
  • Django 模型字段类型和字段参数总结
    models.AutoField作用说明:默认生成列名为id的列,并设置为主键数据类型:int(11)必备参数:primary_key=True作为主键存在主键django会默认自带ColName=models.AutoField(primary_key=True)2.models.CharField作用说明:字符串字段,长度小于255数据类型:varchar(50)必......
  • 1. DRF 异常处理
    目录DjangoDRF异常处理1.DRF对异常(Exception)的处理源码2.自定义异常返回utils/handlers.pyutils/exceptions.pyviews.pyDjangoDRF异常处理1.DRF对异常(Exception)的处理源码request请求先进到APIView的dispatch方法,如果有异常走到exception。2.自定义异常返回uti......