首页 > 其他分享 >@action【示例】

@action【示例】

时间:2024-09-29 11:36:42浏览次数:10  
标签:obj permission 示例 list children role action id

urls.py

from django.urls import path
from utils.ext_url import rbac_path
from utils.router import RbacSimpleRouter
from api import views

router = RbacSimpleRouter()
router.register(r"user", views.UserView, text="用户")  # user-list  user-detail
router.register(r"permission", views.PermissionView, text="权限")  # permission-list  get  post

# /api/role/              role-list   GET  POST
# /api/role/permission    role-total-permission   GET
# /api/role/ID  role-detail GET  PUT  DELETE
# /api/role/ID/permission  role-permission  GET
router.register(r"role", views.RoleView, text="角色")  # role-list  get  post   role-detail   /api/role/id/

urlpatterns = [
    path('login/', views.LoginView.as_view()),
]

urlpatterns += router.urls

views.py

from rest_framework.decorators import action

class RoleModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Role
        fields = ["id", "name", ]


class RoleView(BaseView, ModelViewSet):
    authentication_classes = [JwtAuthentication]
    permission_classes = [RbacPermission]

    queryset = models.Role.objects.all().order_by("-id")
    serializer_class = RoleModelSerializer

    @action(detail=False, methods=['get'], url_path="permission")
    def total_permission(self, request):
        # /api/role/permission/
        info = {}
        queryset = models.Permission.objects.all().order_by("route", "method")
        for obj in queryset:
            row = {"id": obj.id, "label": obj.method.upper()}

            if obj.name not in info:
                info[obj.name] = {
                    "label": obj.name,
                    "children": {
                        obj.route: {
                            "label": obj.route,
                            "node_horizontal": True,
                            "children": [
                                row
                            ]
                        }
                    }
                }
                continue
            if obj.route not in info[obj.name]['children']:
                info[obj.name]['children'][obj.route] = {
                    "label": obj.route,
                    "node_horizontal": True,
                    "children": [
                        row
                    ]
                }
                continue
            info[obj.name]['children'][obj.route]['children'].append(row)

        for item in info.values():
            item['children'] = item['children'].values()
        return Response(info.values())

    @action(detail=True, methods=['get', "post"], url_path="permission")
    def permission(self, request, pk):
        if request.method == "GET":
            # /api/role/pk=角色ID/  获取pk用户关联的所有权限 [1,2,3]
            queryset = models.Permission.objects.filter(role=pk)
            per_id_list = {obj.id for obj in queryset}
            return Response(per_id_list)

        # 权限写入到数据库  [11,22,33,4]
        per_id_list = request.data.get('permissions')
        # print(per_id_list)

        # instance = models.Role.objects.filter(id=pk).first()
        # instance = models.Role.objects.get(id=pk)
        instance = self.get_object()
        instance.permissions.set(per_id_list)

        return Response("OK")

标签:obj,permission,示例,list,children,role,action,id
From: https://www.cnblogs.com/cloud-2-jane/p/18439320

相关文章

  • GaussDB SQL基础语法示例-GOTO语句
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。GOTO语句是直观基本的控制流语句,会导致控制流发生无条件更改。它用于分流至使用SQL过程中定......
  • GaussDB SQL基本语法示例-CASE表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、CASEExpression(CASE表达式)介绍在GaussDBSQL中,CASE表达式(CASEExpression)是一个非常强大......
  • 与 USB 优盘优化相关的 .reg 文件示例。这些设置可以帮助提高 USB 存储设备的性能和管
      WindowsRegistryEditorVersion5.00;启用快速删除模式(防止意外数据丢失)[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsbStor]"Start"=dword:00000003;确保USB存储服务启动;提高USB数据传输速度[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servi......
  • FFmpeg 初学者需要掌握的基础知识和实用技能。每个部分可以深入讲解,提供具体的命令示
    FFmpeg初级使用教程大纲1. FFmpeg简介什么是FFmpegFFmpeg的主要功能安装FFmpeg2. 基本命令格式FFmpeg的基本命令结构输入与输出文件的指定常用选项的介绍3. 常用命令示例转换视频格式示例:将MP4转换为AVI提取音频示例:从视频中提取音频压缩视......
  • 优化 Windows 系统中的万兆网卡(10Gbps 网卡)可以通过修改注册表来实现。以下是一些常见
    优化Windows系统中的万兆网卡(10Gbps网卡)可以通过修改注册表来实现。以下是一些常见的注册表设置示例,可以帮助提高网络性能。 常用的注册表设置启用TCP窗口扩大路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters值:TcpWindowSize类型:DWORD数据:0......
  • RocksDB代码分析——Compaction的输入文件的选择
    这里主要分析LevelCompactionBuilder::PickCompaction是如何选择输入文件的。SetupInitialFiles();找一个需要compact到下层的SSTfile。只会在score>=1的level里找。score的计算见VersionStorageInfo::ComputeCompactionScore({%post_linkStorage/'RocksDB代码分析——Compa......
  • RocksDB代码分析——Compaction流程
    这里从DBImpl::MaybeScheduleFlushOrCompaction开始讲起。DBImpl::MaybeScheduleFlushOrCompaction可能会scheduleDBImpl::BGWorkFlush和DBImpl::BGWorkCompaction。这里主要看Compaction。Flush部分见{%post_linkStorage/'RocksDB代码分析——Flush流程'%}DBImpl::BGWorkCo......
  • <<迷雾>> 第 2 章 用电来表示数 示例电路
    开关的通断对应着1和0info::操作说明鼠标单击开关切换开合状态primary::在线交互操作链接https://cc.xiaogd.net/?startCircuitLink=https://book.xiaogd.net/cyjsjdmw-examples/assets/circuit/cyjsjdmw-ch02-01-represent-number-by-switch.txt原图通过使用多......
  • DAMA-CDGA 模拟试题 示例50道题
    1、关于元数据管理原则说法正确的是 A.确保员工了解如何访问和使用元数据。B.制定、实施和审核元数据标准,以简化元数据的集成和使用。C.创建反馈机制,以便数据使用者可以将错误或过时的元数据反馈给元数据管理团队。D.以上都对正确答案:D答案解析:P322.目标和原则2......
  • 06 内存地址示例 重点
    ################################回顾示例1v1=[1,2,3]#开僻内存空间v2=[1,2,3]#开僻内存空间示例二v1=[1,2,3]#v2、v3都指向变量v1内存地址v2=v1v3=v1v1.append(999)#此时v2/v3都会发生变化,因v1把内存地址中的值进行修改了示例三v......