【Django学习】(十四)自定义action_router

news2025/7/5 4:54:37

之前我们的视图类可以继承GenericViewSet或者ModelViewSet,我们不用再自定义通用的action方法,但是有时候我们需要自定义action,我们该如何设计呢?

自定义action

1、手写视图逻辑

1.1、先在视图集里自定义action方法,名称为names

class ProjectsViewSet(
    viewsets.ModelViewSet):
    # 指定当前类视图需要使用的查询集
    queryset = ProjectsModel.objects.all()
    # 指定当前类视图需要使用的序列化器类
    serializer_class = ProjectModelSerializer
    # lookup_field = 'Id'
    # 声明需要使用的引擎类
    filter_backends = [filters.SearchFilter,
                       filters.OrderingFilter
                       ]
    # 定义需要过滤的字段
    search_fields = ['name', 'id']

    # 定义需要排序的字段
    ordering_fields = ['id', 'name']
    # 声明需要使用的分页引擎
    pagination_class = PageNumberPagination
    @action(methods=['GET', 'POST'], detail=False)
    def names(self, request, *args, **kwargs):
        qs = self.get_queryset()
        lst = []
        for obj in qs:
            dict = {
                'id': obj.id,
                'name': obj.name,
            }
            lst.append(dict)
        return Response(lst, content_type='application/json')

1.2、在路由表url.py中定义新的路由

urlpatterns = [
    path('projects/names/',views.ProjectsViewSet.as_view({'get':'names','post':'names'})),
]

 支持get和post请求方式

 

 2、使用序列化器类

2.1创建一个新的序列化器类

class ProjectNameSerializer(serializers.ModelSerializer):

    class Meta:
        model = ProjectsModel
        fields = ('id', 'name')

2.2路由表定义路由

urlpatterns = [
    path('projects/names/',views.ProjectsViewSet.as_view({'get':'names','post':'names'})),
]

仅仅只有视图集继承Viewset或者GenericViewset之后,才具备方法名与action进行一一对应的功能 

2.3 重写视图类中的自定义action方法

from .serializers import ProjectNameSerializer
    @action(methods=['GET', 'POST'], detail=False)
    def names(self, request, *args, **kwargs):
        qs = self.get_queryset()
        # lst = []
        # for obj in qs:
        #     dict = {
        #         'id': obj.id,
        #         'name': obj.name,
        #     }
        #     lst.append(dict)
        # return Response(lst, content_type='application/json')
        serializer_obj = ProjectNameSerializer(instance=qs, many=True)
        return Response(serializer_obj.data, status=status.HTTP_200_OK)

 2.4 将ProjectNameSerializer抽离出来,并且重写get_serializer_class方法

  • 如果当前类视图中,使用了多个不同的序列化器类,那么可以将get_serializer_class重写
  • 继承视图集类之后,会提供action属性,指定当前请求的action方法名称
  • 可以根据不同的action去选择不同的序列化器类(不同的查询集)
    @action(methods=['GET', 'POST'], detail=False)
    def names(self, request, *args, **kwargs):
        qs = self.get_queryset()
        serializer_obj=self.get_serializer(instance=qs, many=True)
        return Response(serializer_obj.data, status=status.HTTP_200_OK)

    def get_serializer_class(self):
        if self.action=='names':
            return ProjectNameSerializer
        return self.serializer_class

 如果请求的是/projects/names/,使用的是自定义的序列化器类进行数据输出

 如果请求的是其他路由路径,能够使用全局指定的序列化器类(serializer_class=ProjectModelSerializer)正常处理数据,进行序列化输出

  •  可以使用action装饰器,指定自定义action方法(使用路由器时,会自动生成路由条目)
  • 如果不指定methods,那么当前action只支持GET方法请求
  • 可以指定当前action支持多个请求方法,需要将请求方法大写添加至列表中
  • detail指定当前action是否为详情视图
  • url_path指定url的路径字符串
  • url_name指定url路径的名称
  • 如果不指定url_path和url_name,默认为action方法名称

 注册路由

在路由表中导入routers

from rest_framework import routers

router = routers.SimpleRouter()
# 注册路由
router.register(r'projects', views.ProjectsViewSet)

urlpatterns = router.urls
​

 注册路由:

  • 仅仅只有视图集才支持定义路由器功能
  • register方法可以注册路由条目
  • 第一个参数为路由条目的前缀,往往需要添加r'子应用名'
  • 第二个参数为视图集对象,无需调用as_view({})
  •  可以定义DefaultRouter对象,相比SimpleRouter路由对象,会自动添加一个根路由(指定当前项目的入口地址)
    • router = routers.DefaultRouter()

 

如果没有指定url_path和url_name,则通过路由名称去获取URL路径

 如果在action里指定了url_path和url_name,则url_path指定url的路径字符串,url_name指定url路径的名称

@action(methods=['GET', 'POST'], detail=False,url_path='na', url_name='an')
def names(self, request, *args, **kwargs):
    qs = self.get_queryset()

 

 有时候,有些路由我们不想通过路由器生成,需要在urlpatterns里生成

方式一:可以附加router.urls到现有视图的列表.

from rest_framework import routers

router = routers.SimpleRouter()
# 注册路由
router.register(r'projects', views.ProjectsViewSet)
urlpatterns = []
urlpatterns += router.urls

方式二:或者可以使用 Django 的include函数,就像这样

from rest_framework import routers

router = routers.SimpleRouter()
# 注册路由
router.register(r'projects', views.ProjectsViewSet)
urlpatterns = [
          path('', include(router.urls))
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 790. 多米诺和托米诺平铺 - 二维空间的动态规划

多米诺和托米诺平铺 中等 304 相关企业 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个…

icp许可证 办理流程(icp资质申请条件)

icp许可证 办理流程(icp资质申请条件)是什么? ICP经营许可证是可以线上无忧办理的,包下证,流程也很简单,只需要你提供企业营业执照、法人身份证这些基础材料就可以。加急10-20工作日拿证,普通20-60工作日拿证。 在了解…

使用Vue的插件clipboard使用复制功能

1.安装clipboard插件 npm install clipboard 2.使用 clipboard <template><div style"margin-right: auto;margin-left: auto; 800px"><el-table :data"list"><el-table-column label"搜索引擎" prop"name"&g…

Python迭代器与生成器

文章目录 迭代器创建迭代器StopIteration 生成器 迭代器 访问集合元素的一种方式&#xff0c;可以记住遍历的位置的对象 从集合的第一个元素开始&#xff0c;直到所有的元素被访问完结束&#xff0c;迭代器只能往前不会后退 iter()&#xff0c;创建迭代器对象 iter(object, …

docker中配置mysql主从分离

目录 前言 1、下载mysql安装包 2、mysql 读写分离 3、docker安装三台mysql服务 4、修改主从配置文件 5、重启mysql 6、配置主库 7、配置从库创建同步账户 7.1、进入MySQL01和MySQL02和mysql03服务器新增MySQL用户user 密码root 用于同步账号和密码&#xff1b; 7.2、验…

说好的见框就插呢?

说好的见框就插呢&#xff1f; 背景一句话讲原理速挖XSS 背景 每一个学安全的&#xff0c;都听说过一句话&#xff0c;挖XSS就是见框就插&#xff0c;不得不说这个方法很有用&#xff0c;但是经常遇到插不进去的情况。今天浅聊一下XSS漏洞 一句话讲原理 XSS原理和注入很像&…

SpringCloud Alibaba——Ribbon的属性配置和类配置优先级

目录 一、Ribbon的属性配置和类配置哪个优先级高二、Ribbon的属性配置和类配置优先级源码解读 一、Ribbon的属性配置和类配置哪个优先级高 类配置优先级高 二、Ribbon的属性配置和类配置优先级源码解读 通过RibbonClientConfiguration类中的ribbonRule方法可知&#xff0c;优…

实现将redis中的所有数据备份到数据库表中

实现将redis中的所有数据备份到数据库表中 /*** 将redis中的数据同步到mysql中*/Overridepublic void saveMysqlForRedis(){Jedis jedis new Jedis("127.0.0.1", 6379);//System.out.println(jedis.ping());Set keys jedis.keys("*");//列出所有的keyI…

深度解读为什么说软件测试人人都能学

目录 1.软件测试的发展历程 2.软件测试行业优势 3.优就业软件测试学科优势 1.软件测试的发展历程 软件测试从上个世纪50年代发展至今&#xff0c;共经历了五个阶段&#xff1a;调试测试、证明测试、破坏性测试、评估测试、预防测试等&#xff0c;如下图&#xff1a; 现在已…

什么是NUMA,我们为什么要了解NUMA

在IA多核平台上进行开发时&#xff0c;我们经常会提到NUMA这个词 &#xff0c;那么NUMA到底指的是什么&#xff1f;我们怎么可以感受到它的存在&#xff1f;以及NUMA的存在对于我们编程会有什么影响&#xff1f;今天我们一起来看一下。 1、NUMA的由来 NUMA(Non-Uniform Memory…

MySQL(十):MySQL语法-进阶

MySQL语法-进阶 数据类型Text 类型Number 类型Date 类型 ASALTER TABLEconcat、group_concatSQL注入阻止SQL注入方案一方案二方案三 HAVING 子句临时表正则表达式获取服务器元数据事务导出数据导出数据导出表作为原始数导出SQL格式的数据 导入数据解决无法导入问题使用 LOAD DA…

kali linux 安装python 3xx 以及多版本切换的方式

简介 在渗透测试的时候&#xff0c;我们通常会用到不同的工具&#xff0c;这些工具可能对python的版本要求不一样&#xff0c;这个时候我们可能就需要在kali上面安装不同版本的python&#xff0c;以及灵活的切换python的版本。 下载python3并安装 以python38来举例&#xff…

Visual Studio 中的新特性:可视化宏扩展

今天&#xff0c;我们很高兴地宣布在 Visual Studio 17.7 预览版中推出可视化宏扩展功能。这个新功能通过可视化的方式对宏代码进行逐步扩展。 若要开始使用此功能&#xff0c;请确保你的 Visual Studio 版本更新到最新版本的 Visual Studio 预览版。 下面&#xff0c;我们来看…

图解Vit 3:Vision Transformer——ViT模型全流程拆解

文章目录 Layer NormalizationClassification TokenPosition embeedding 先把上一篇中的遗留问题解释清楚&#xff1a;上图中&#xff0c;代码中的all_head_dim就是有多少head。把他们拼接起来。 Encoder在Multi-Head Self-Attention之后&#xff0c;维度一直是BND&#xff0c;…

python flask 通过页面输入python代码,执行结果返回页面

1&#xff0c;不太好用 项目结构 app.py from flask import Flask, render_template, request import io import sysapp Flask(__name__)app.route(/) def index():return render_template(index.html)app.route(/execute, methods[POST]) def execute():code request.form[…

B071-项目实战-用户模块--手机注册 管理员登录

目录 完成注册功能后端开发完成UserControllerUserServiceImplLogininfoMapper 前端页面完成绑定数据绑定事件准备登录页 管理员登录1需求分析登录设计页面设计表设计流程设计所需技术 员工新增级联操作登录信息EmployeeServiceImplShopServiceImpl 管理员登录2前端页面后端接口…

Learning to cartoonize using white-box cartoon representations

论文笔记--漫画生成--White-box Cartoon Representations - 知乎论文 Learning to Cartoonize Using White-box Cartoon Representations 源码https://github.com/SystemErrorWang/White-box-Cartoonization效果算法概述这篇论文是将图像风格转成漫画风格&#xff0c;作者认为可…

MySQL索引index

目录 1.索引的概念 2.索引的优缺点 3.索引的数据结构 4.索引结构 1.二叉树&#xff1a; ​编辑2.红黑树&#xff1a; 3.BTree&#xff08;B-Tree&#xff09;&#xff1a; ​编辑4.传统BTree&#xff1a; ​编辑5.MySQL中的BTree&#xff1a; ​编辑6.Hash&#xf…

浅谈电子设备之电磁屏蔽箱设计要点

屏蔽箱又称隔离箱、屏蔽盒和电磁屏蔽箱&#xff0c;可以对传导和辐射进行处理&#xff0c;为无线通讯产品生产制造提供高效的隔离测试环境&#xff0c;测试内容包含耦合测试、RF功能测试、电磁干扰测试和电磁兼容性测试。屏蔽箱多采用铝合金材料设计&#xff0c;屏蔽材料阻隔能…

C语言模拟实现字符串处理函数

需要多一点点勇气&#xff0c;来面对变差的自己 大家好&#xff0c;我是纪宁。 这篇文章为大家带来的是5大字符串处理函数的模拟实现。 文章目录 1.strlen函数的模拟实现 2.strcpy函数的模拟实现 3.strcmp函数的模拟实现 4.strcat函数的模拟实现 5.strstr函数的模拟实现…