hualinux dj3 2.6:drf ViewSets使用@action添加路由及传参

2023-11-05

目录

一、viewSets @active修饰器介绍

1.1 介绍

1.2 用法 

二、例子

2.1 需求

2.2 分析

2.2.1 @action自定义路由

2.2.2 @action url_path不支持尖括号传参问题

2.3 实现代码

2.4 测试效果


上篇讲了,使用视图集ViewSets编写通过学号sid查找学生成绩。我们使用router功能注册视图集时,自动帮生成了一套http方法get、post、put、patch、delete等,它生成的方法名是固定的。

如果我想像通用视图generics例子那样,自定义方法并传参怎办?可以使用@action修饰器。这篇就是主要讲的。

一、viewSets @active修饰器介绍

1.1 介绍

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

1.2 用法 

源码中action方法如下:

def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs):
    ...
  • methods
    • 支持的请求方式,为一个列表,默认为['get']
  • detail
    • 必传参数,
    • 要处理的是否是详情资源对象(即是否通过url路径获取主键)
    • True表示需要传递主键id,使用通过URL获取的主键对应的数据对象
    • False表示不需要传递主键id,不使用URL获取主键
  • url_path
    • 指定url路由名称,默认为action名称
  • url_name
    • 指定url的名称,默认为action名称

注:url_path不支持尖括号<>传参数,如'<str:stuName>'这种是不支持的。但支持python正则表达式,可以使用形如 (?P<stuName>\w+)

二、例子

2.1 需求

我们在上篇例子基础上,改一下不通过学号sid查询学生成绩,而是通过自定义方法名findStuByName学生名查询成绩。

2.2 分析

例子中默认使用的是以学号sid查询成绩的,如果改用自定义方法findStuByName查询成绩的话有几点需要考虑

2.2.1 @action自定义路由

我们定义了方法名需要添加路由,那么我们可以使用@action修饰器

2.2.2 @action url_path不支持尖括号传参问题

@action url_path参数是不支持尖括号<>传参数的,如果写成<str:stuName>',会报404找不到

比如 我把url_path写成

url_path='name/<str:stuName>'

其中 name/ 是 路径,stuName是要传的参数,名字叫stuName,访问会报404

因为它不支持<>,但它支持正则表达式,我们可以写成

url_path=r'name/(?P<stuName>\w+)'

2.3 实现代码

我没有添加权限,因为学生名可能有多个,所以我使用的是查询集并不是单实例或对象的get方法

app/views.py中StuViewSet类代码修改如下:

# 使用drf通用视图,queryset和serializer_class属性不能少
class StuViewSet(viewsets.ModelViewSet):
    queryset = Stu.objects.all()
    serializer_class = StudentSerializer
    # 默认是pk主键,我修改为sid字段
    lookup_field = 'sid'

    # url_path后面不要加‘/’,否则变成双斜杠,如url_path='t1/‘ ,访问变成www.xxxx.com/xxx/t1//
    # rul_path不支持参数,可以放百请求主体中,get写成/stu/t1/?name=fly
    @action(methods=['get',  'post'], detail=False, name='t1', url_path=r'name/(?P<stuName>\w+)')
    def stuName(self, request, stuName):
        print(request.data)
        res = Stu.objects.filter(name=stuName)
        serializer = StudentSerializer(res, many=True)
        return Response(serializer.data)

因为我在app/urls.py做了一个路由注册

router.register(r'stu', views.StuViewSet)
...
urlpatterns = [
    ...
    # 把路由的url包含进去,这样就做到了路径与函数的映射
    re_path('', include(router.urls)),
]

.这样就上面的访问路径变成 xxx:<端口号>/stu/name/<学生名>

2.4 测试效果

运行django,打开浏览器并输入 http://127.0.0.1:8000/stu/name/fly/,效果如下图所示:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hualinux dj3 2.6:drf ViewSets使用@action添加路由及传参 的相关文章

随机推荐

  • 攻防世界之disabled_button(web简单)

    老师今天上课讲了前端知识 然后给了大家一个不能按的按钮 小宁惊奇地发现这个按钮按不下去 到底怎么才能按下去呢 打开可以看到一个按钮 但是无法点击 按f12 打开代码 这里是可以互动的 找到按钮位置 删除属性 disabled 按下回车 确认
  • SQL Server附加数据库错误5123,另一个进程正在调用

    情况一 在使用sql server附加数据库时 出现了 首先 我想讲一个故事 我想拿自己的银行卡 取出父亲银埋在家中30米地下的钱 这两个对象的位置是同一个吗 显然不是 出现此报错的原因是 我在自己的机器上登录远程服务器数据库 然后检索远程
  • redis 三. hash应用场景及底层分析

    Hash 类型 一 简单命令示例 二 java 操作示例 三 使用场景 四 底层分析 ziplist 压缩列表 ziplist内部entry详解 ziplist内存分配与连锁更新 ziplist 小总结 hashtable 字典 一 简单命
  • vue面试题:说说vue操作真实dom性能瓶颈

    vue面试题 说说vue操作真实dom性能瓶颈 下面一起来看看吧 vue性能瓶颈的几种情况 一次渲染大量的数据的时候 存在大量数据并且都是复杂类型的时候 会导致vue对数据的劫持时间和渲染时间变长 js 连续执行时间过长 会导致页面长时间无
  • nodejs之Buffer(缓冲区)

    参考 http www runoob com nodejs nodejs buffer html JavaScript 语言自身只有字符串数据类型 没有二进制数据类型 但在处理像TCP流或文件流时 必须使用到二进制数据 因此在 Node j
  • 这是一篇用来刷题群测试博客

    这是一篇用来刷题群测试博客 这是一篇用来刷题群测试博客
  • 研究ELF文件的工具objdump&readelf

    NAME objdump display information from object files SYNOPSIS objdump a archive headers b bfdname target bfdname C demangl
  • warning: #223-D: function “strlen“ declared implicitly

    问题描述 在使用Keil5编译C文件时报错 warning 223 D function strlen declared implicitly 问题解决 在主函数中加入 extern size t strlen const char
  • continue与break --- 循环控制的两大巨头

    目录 前言 break continue 总结 前言 continue与break都是用于循环语句的 帮助我们更好的控制循环流程 我们以while循环为例 来深度解析continue与break语句 这是while语句的基本结构 结合con
  • FastDFS安全注意事项

    FastDFS安全注意事项 本篇文章转载于 FastDFS 作者 余庆 大佬的 FastDFS分享与交流 公众号 对于互联网应用 FastDFS 的标准使用姿势 通过 FastDFS API 进行文件上传等更新操作 storage serv
  • Jmeter(二十八) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy1(详解教程)

    1 简介 在使用jmeter自动录制脚本时会产生很多无用的请求 所以推荐使用badboy录制脚本之后保存为jmx文件 在jmeter中打开使用 因此宏哥在这里介绍一下Badboy这款工具 本来打算不做介绍了 原因是因为这款工具已经不在维护和
  • python-selenium-弹窗的处理

    切换到弹窗视角 alert driver switch to alert 点击弹窗中的确认 alert accept 点击弹窗中的取消 alert dismiss 获取弹出框的信息内容 alert text 当遇到弹窗时 1 切换到弹窗视角
  • Android Socket详细使用攻略

    前言 Socket的使用在 Android网络编程中非常重要 今天我将带大家全面了解 Socket 及 其使用方法 目录 1 网络基础 1 1 计算机网络分层 计算机网络分为五层 物理层 数据链路层 网络层 运输层 应用层 其中 网络层 负
  • C语言第一次作业练习

    以下程序教材基于 谭浩强C程序设计 第四版 第1题 参照例1 3 在Visual C 6 0环境中继续完成教材P 15 习题6 此程序于2017年3月1日12 48编写 目的 当用户在命令窗口输入a b c三个值 输出 其中最大者 incl
  • windows10下配置android-studio-ide

    前言 android studio ide配置对于新手来说可能有一点点麻烦 这里详细记录一下 希望对新手有所帮助 大佬请忽略哈 下载 android studio ide官网下载地址 谷歌官网的这个地址目前对天朝开放 android stu
  • C#判断字符串中有没有字母,正则表达式、IsLetter

    要判断字符串中是否包含字母 可以使用正则表达式或者循环遍历字符串的方式 方法一 使用正则表达式 using System Text RegularExpressions string input Hello123 bool contains
  • 单例模式、工厂模式,观察者模式

    单例模式 Singleton 限制了类的实例化次数只能一次 从经典意义来将 单例模式 在实例不存在的时候 可以通过一个方法创建一个类来实现创建类的新实例 如果实例已经存在 他会简单返回该对象的引用 单例模式不同于静态类 可以推迟它们的初始化
  • csharp:Dapper Sample

    You can find Dapper on Google Code here http code google com p dapper dot net and the GitHub distro here https github co
  • Redis集群的那些谜

    下列问题是我在搭建Redis集群之前与实验过程发出的疑问 随着我Redis集群的成功搭建 疑问也一个一个解开 Redis集群搭建参考资料 Redis Cluster参考资料 Redis集群的数据互通吗 先说结论 互通的 往Redis集群里存
  • hualinux dj3 2.6:drf ViewSets使用@action添加路由及传参

    目录 一 viewSets active修饰器介绍 1 1 介绍 1 2 用法 二 例子 2 1 需求 2 2 分析 2 2 1 action自定义路由 2 2 2 action url path不支持尖括号传参问题 2 3 实现代码 2