首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Django DRF @action 装饰器

编程知识
2024年07月17日 10:59

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

From:https://www.cnblogs.com/beichengshiqiao/p/18307014
本文地址: http://www.shuzixingkong.net/article/94
0评论
提交 加载更多评论
其他文章 拯救SQL Server数据库事务日志文件损坏的终极大招
拯救SQL Server数据库事务日志文件损坏的终极大招 在数据库的日常管理中,我们不可避免的会遇到服务器突然断电(没有进行电源冗余),服务器故障或者 SQL Server 服务突然停掉, 头大的是ldf事务日志文件也损毁了,SQL Server服务器起来之后,发现数据库处于"Recove
拯救SQL Server数据库事务日志文件损坏的终极大招 拯救SQL Server数据库事务日志文件损坏的终极大招 拯救SQL Server数据库事务日志文件损坏的终极大招
js需要同时发起百条接口请求怎么办?--通过Promise实现分批处理接口请求
如何通过 Promise 实现百条接口请求? 实际项目中遇到需要发起上百条Promise接口请求怎么办? 前言 不知你项目中有没有遇到过这样的情况,反正我的实际工作项目中真的遇到了这种玩意,一个接口获取一份列表,列表中的每一项都有一个属性需要通过另一个请求来逐一赋值,然后就有了这份封装 真的是很多功
BigDecimal的精度与刻度
BigDecimal是Java中用于高精度算术运算的类。当您需要精确地处理非常大或非常小的数字时,例如在金融计算中,它特别有用。由于众所周知得原因,Double这种类型在某些情况下会出现丢失精度的问题,所以在需要对较为敏感的数据(比如与金额有关的)进行运算时,我们都会用BigDecimal。但是,用
BigDecimal的精度与刻度 BigDecimal的精度与刻度
共享库soname机制
目录前言共享库版本号共享库命名机制realnamesonamelinkname总结参考文章 前言 在使用第三方库时,我们会发现第三方库会提供一组文件,他们的后缀一般是.so(如libname.so),.so.x和.so.x.y.z。本文讨论他们之间的关系。 共享库版本号 共享库一般会由于修复bug或
共享库soname机制
OceanBase 金融项目优化案例(union all 改写)
在工单系统上看到有一条sql问题还没解决,工单描述看到压测场景被cpu资源被这条sql打爆,目前影响到项目进度,比较紧急。 直接联系这位同学看看是否需要帮忙。 慢SQL: SELECT task.*, sc01.aab300 bjsjjg, (SELECT sc05.bsc012 FROM sc05
OceanBase 金融项目优化案例(union all 改写) OceanBase 金融项目优化案例(union all 改写) OceanBase 金融项目优化案例(union all 改写)
Microsoft宣布将在开发人员会议上专注于.NET Aspire
2024年7月15日微软宣布,其开发执行团队将在下个月的开发者大会上聚焦于使用 .NET Aspire 的云原生开发,以及结合人工智能的“现代 SQL”在 Microsoft Fabric 中的应用。微软的 Visual Studio LIVE! 2024 大会不仅是一个会议,而是创新、学习和社区庆
Microsoft宣布将在开发人员会议上专注于.NET Aspire Microsoft宣布将在开发人员会议上专注于.NET Aspire
基于 Vagrant 手动部署多个 Redis Server
环境准备 宿主机环境:Windows 10 虚拟机环境:Vagrant + VirtualBox Vagrantfile 配置 首先,我们需要编写一个 Vagrantfile 来定义我们的虚拟机配置。假设已经在 D:\Vagrant\redis 目录下创建了一个 Vagrantfile,其内容如下:
基于 Vagrant 手动部署多个 Redis Server 基于 Vagrant 手动部署多个 Redis Server 基于 Vagrant 手动部署多个 Redis Server
36岁,大龄剩男,2024上半年总结......
不知道我在等什么,也不知道这样等了多久,相信看到这句话的你,可能也是一头雾水吧! 还是以往的风格写到哪算哪,写东西真的是看感觉和心情都具备,写出来的东西才更有灵性,或者说更容易引起共鸣吧! 我在逃避? 可以这么说,但也不完全是,在一部分事情开始收尾的时候,情绪脑就占据了主导地位,就是想摆烂,什么也不