Datawhale Django 后端开发入门 Task05 DefaultRouter、自定义函数

news2024/9/22 4:06:21

一、DefaultRouter是Django REST framework中提供的一个路由器类,用于自动生成URL路由。路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由,从而减少了手动编写URL路由的工作量。

1. 使用方法

导入DefaultRouter类,实例化一个router,然后使用router.register()方法注册视图集:

from rest_framework import routers

router = routers.DefaultRouter()

router.register(r'users', UserViewSet)

这样就可以自动为UserViewSet生成URLConf了。

2. 工作原理

DefaultRouter内部实现了一个register方法,它会去分析传入的视图集,获取它的一些属性如queryset、serializer_class等。

根据这些信息,DefaultRouter会为这个视图集生成5种默认的URL模式:

- list - 获取视图集queryset的列表数据
- detail - 获取queryset单个对象的数据
- create - 创建新的对象
- update - 更新对象
- partial_update

- 更新对象的部分字段这简化了视图集与URL之间的绑定,开发者只需要编写视图集类,而URLConf可以自动生成。

3. 自定义扩展

DefaultRouter也支持自定义路由方式,可以通过重写路由器的get_urls方法来实现。所以DefaultRouter为DRF的视图集提供了便捷的自动URL绑定方式,减少了重复劳动,是DRF框架的一个很好的设计。

4.在本次案例中的应用(可与以上进行对比)

urls.py

from django.contrib import admin
from django.urls import path
from apps.erp_test.views import *

from rest_framework import routers

router = routers.DefaultRouter()
router.register('GoodsCategory', GoodsCategoryViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('filtergoodscategory/', FilterGoodsCategory),
    path('insertgoodscategory/', InsertGoodsCategory),
    path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),
    path('getgoods/', GetGoods.as_view()),
]


urlpatterns += router.urls

使用routers.DefaultRouter()​创建了一个默认的路由器对象,并使用router.register()​方法注册了一个视图集,GoodsCategoryViewSet​。这样可以自动为这个视图集生成对应的URL路由,并将其添加到urlpatterns​中。

(1. 创建DefaultRouter实例

router = routers.DefaultRouter()

这里实例化了默认的路由器。

(2. 注册视图集

router.register('GoodsCategory', GoodsCategoryViewSet)

使用register方法注册了GoodsCategory视图集。

(3. 包含自动生成的URL

urlpatterns += router.urls

自动将路由器生成的URL模式包含到urlpatterns中。这样,DefaultRouter会根据GoodsCategoryViewSet的信息,自动生成一组CRUD URL模式:

- /GoodsCategory/ - 名为GoodsCategory的endpoint
- GET /GoodsCategory/ - 查询所有分类
- POST /GoodsCategory/ - 新增分类
- GET /GoodsCategory/{pk}/ - 根据主键获取单个分类
- PUT /GoodsCategory/{pk}/ - 更新整个分类
- PATCH /GoodsCategory/{pk}/ - 更新部分分类
- DELETE /GoodsCategory/{pk}/ - 删除分类

开发者只需要编写视图集逻辑,URL定义都由DefaultRouter自动完成了。这种设计很好地体现了DRF框架的优势,可以快速高效地开发API。

二、自定义函数

@action 是 Django REST framework 中的一个装饰器,用于将自定义函数转换为视图集的一个动作。@action 装饰器提供了一种定义自定义函数的方式,这些函数并不直接对应于标准的 CRUD 操作(Create-Read-Update-Delete),而是实现一些其他的自定义行为或业务逻辑。

使用这个装饰器的典型步骤是:

1. 从 rest_framework.decorators 中导入 @action 装饰器

2. 定义一个自定义函数,实现特定的业务逻辑

3. 使用 @action 装饰这个自定义函数

4. 在视图集类中包含这个加了装饰器的自定义函数

5. 这样这个自定义函数就成为了该视图集的一个动作操作

6. 可以向标准的 CRUD 接口一样来调用这个自定义的操作接口@action 装饰器为 Django REST framework 提供了开箱即用的方式去扩展视图集,实现除了 CRUD 之外的其他自定义行为,非常方便和灵活。

class GoodsCategoryViewSet(ModelViewSet):
    # 指定查询集(用到的数据)
    queryset = GoodsCategory.objects.all()
    # 指定查询集用到的序列化容器
    serializer_class = GoodsCategorySerializer

    @action(detail=False, methods=['get'])
    def latest(self, request):
        latest_obj = GoodsCategory.objects.latest('id')
        print(latest_obj)
        return Response("helllo 你调用了自定义的函数")

这段代码定义了一个GoodsCategoryViewSet视图集,并使用@action装饰器添加了一个自定义的latest操作。

1. 首先定义了queryset和serializer_class,指定了该视图集要操作的模型和序列化类。

2. 然后使用@action装饰器定义了latest方法,并指定它响应GET请求。

3. latest方法中,查询了id最大(最新的)的一个GoodsCategory对象。

4. 打印了该对象,并返回一个响应。

5. 这样就定义好了latest自定义操作。

6. 可以通过类似"/goods_categories/latest/"的URL来调用这个操作。

7. @action装饰器实现了在不修改视图集类的情况下,添加自定义行为的方式。

8. 使代码更清晰,也方便重用。

所以@action是DRF提供的非常有用的装饰器,可以提高视图集扩展性和灵活性。

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

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

相关文章

五种消息模型简单说明

五种消息模型简单说明 RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。  我们通过一个demo工程来了解下RabbitMQ的…

代码随想录算法训练营(23/6/25)LeetCode 84.柱状图中最大的矩形

LeetCode 84.柱状图中最大的矩形 今天是算法训练营的打卡的最后一天,我开始觉得我能坚持下来,但因为个人原因,还有期末考试我花太多心思,打卡就一直断断续续,博客没怎么写,最终也写完了

ctfshow-web10 with rollup 绕过

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 基本方法,到处点一点,点到取消的时候,突然发现,可以下载一个文件: 看到这个源码,可以看到只能是通过满足下面的条件来拿到flag&#xff…

sql server 快速安装

目录标题 一、下载二、直接选择基本安装二、下载ssms(数据库图形化操作页面)三、开启sa账号认证(一)第一步:更改身份验证模式(二)第二步:启用 sa 登录 一、下载 下载地址&#xff1…

ModaHub魔搭社区:AI Agent在操作系统场景下的AgentBench基准测试

近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现,顶级商业LLM在复杂环境中表现出…

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现:单向链表:实现:双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】…

基于原生Servlet使用模板引擎Thymeleaf访问界面

我们常在Spring Boot项目中使用Thymeleaf模板引擎,今天突发奇想,尝试原生Servlet访问! 说做就做 搭建完整的WEB项目 其中的大部分依赖都是后续报错 追加进来的 导入依赖 thymeleaf-3.0.11.RELEASE.jar 第一次访问 访问地址: http://localhost:8080…

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词,不影响任何鼠标键盘操作,不影响工作 2、利用系统热键快速隐藏(ALT1键 隐藏与显示) 3、日积月累单词会有进步 4、软件下载地址: 免安装,代码未加密,安全的屏幕水印学习英语…

Linux学习之ftp安装、vsftpd安装和使用

ftp需要两个端口: 数据端口 命令端口 ftp有两种模式: 被动模式:建立命令连接之后,服务器等待客户端发起请求。 主动模式:建立命令连接之后,服务器主动向客户端发起数据连接,因为客户端可能有防火…

6-2 使用函数求素数和

分数 20 全屏浏览题目 切换布局 作者 张高燕 单位 浙大城市学院 本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。 素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。 函数接口定义: int p…

相关变化率的例子

如图,不解释。 很多物理学上的物理量,直接使用微分和导数来定义,因此可以不加证明的直接使用这些物理量。 解: d l 2 , d w 3 dl 2, dw 3 dl2,dw3 v l 2 w 2 , d v − 2 l d l 2 w d w 2 l 2 w 2 − 2 12 2 2 5…

内网渗透神器CobaltStrike之内网信息收集(九)

收集域内信息 Windows命令 查看网关的ip地址, DNS的ip地址、域名等等:shell ipconfig /all 查看当前主机所在的域: shell net view /domain 查看当前域的主机列表: shell net view 查看指定域的主机列表: shell net view /domain:[domain] 若beacon用户是域控, 则…

数据同步工具比较:选择适合您业务需求的解决方案

在当今数字化时代,数据已经成为企业的核心资产。然而,随着业务的扩展和设备的增多,如何实现数据的高效管理和同步成为了一个亟待解决的问题。本文将介绍几种常见的数据同步工具,并对比它们的功能、性能和适用场景,帮助…

二、9.硬盘驱动程序

文件系统是运行在操作系统中的软件模块,是操作系统提供的一套管理磁盘文件读写的方法和数据组织、存储形式,因此,文件系统=数据结构+算法,哈哈,所以它是程序。它的管理对象是文件,管…

互斥锁的概念,与部分接口

何为互斥 一种对共享数据的保护,防止多线程同时访问共享资源的时,数据混乱的问题。在互斥期间,保证执行流由并行改为串行。任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起…

苍穹外卖 day2 反向代理和负载均衡配置的代码

为什么要整这些玩意 为了并发,为了容错,为了高可用 一 反向代理的代码 server{listen 80;server_name localhost;location /api/{proxy_pass http://localhost:8080/admin/; #反向代理} }**proxy_pass:**该指令是用来设置代理服务器的地址&…

1小时学会Python

1.Hello world 安装完Python之后,打开IDLE(Python GUI) ,该程序是Python语言解释器,你写的语句能够立即运行。 我们写下一句著名的程序语句: 并按回车,你就能看到这句被K&R引入到程序世界的名言。 在解释器中选择"File"--"New Window" 或快捷键 …

如何通过振动判断设备健康度?以PreMaint设备数字化平台为例

在工业生产过程中,设备的健康状况直接关系到生产效率和安全。而振动分析作为一种重要的设备健康监测手段,可以通过监测设备的振动情况来判断其健康状况。本文将以PreMaint设备数字化平台为例,探讨如何通过振动分析来判断设备的健康度&#xf…

【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门

目录 一、Ajax 1、简介 2、Axios (没懂 暂留) (1)请求方式别名 (2)发送get请求 (3)发送post请求 (4)案例 二、前端工程化 1、Vue项目-目录结构 2、…