【Django 05】Django-DRF(ModelViewSet)、路由组件、自定义函数

1. Django-DRF(ModelViewSet)

1.1 DRF是什么?

ModelViewSet 是 Django REST framework 提供的一个视图集类,它封装了常见的模型操作方法。

模型类提供了默认的增删改查功能。

它继承自 GenericViewSetListModelMixinRetrieveModelMixinCreateModelMixinUpdateModelMixinDestoryModelMixin

知识点请求url特点
GenericViewSet提供一组通用的视图方法,方便实现特定功能
ListModelMixinget127.0.0.1:8000/book/提供 list 方法,用于获取资源列表
RetrieveModelMixinget127.0.0.1:8000/book/{1}/提供 retrieve 方法,用于获取单个资源的详细信息
CreateModelMixinpost127.0.0.1:8000/book/提供 create 方法,用于创建资源
UpdateModelMixinput127.0.0.1:8000/book/{1}/提供 update 方法,用于更新资源
DestroyModelMixindetete127.0.0.1:8000/book/{1}/提供 destroy 方法,用于删除资源
自定义get/post127.0.0.1:8000/book/自定义用户自定义方法/函数

这些技术知识点可以配合使用,帮助我们快速构建出具有 CRUD 功能的 Web 应用,并且遵循了 Django 框架的惯例和最佳实践。它们的应用场景包括博客系统、电商平台、社交网络等各种类型的 Web 应用。通过使用这些技术知识点,我们能够提高开发效率,减少重复的代码编写工作,并且保证代码的一致性和可维护性。

1.2 如何使用

设置 queryset 属性为要查询的对象集合,并设置 serializer_class 属性为对应的序列化器类。

1.2.1 示例

view.py

from rest_framework.viewsets import ModelViewSet
class YourModelViewSet(ModelViewSet):queryset = YourModel.objects.all()serializer_class = YourModelSerializer

使用 ModelViewSet 后,你将自动获得默认的 CRUD 方法。

from rest_framework.decorators import action
#### modelviewset
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 你调用了自定义的函数")

serializer.py

class GoodsSerializer(ModelSerializer):# 外键字段相关的数据 需要单独写category = GoodsCategorySerializer()class Meta:# 指定需要序列化的表model = Goods# 指定我们需要序列化的字段fields = '__all__'

2. Django-DRF 路由组件

2.1 路由组件是什么?

DefaultRouter是Django REST framework中提供的一个路由器类,用于自动生成URL路由。

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

2.2 DefaultRouter的使用方法

urls.py

from django.contrib import admin
from django.urls import path
from apps.erp_test.views import *from rest_framework import routersrouter = 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​中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. Django-DRF 自定义函数

3.1 自定义函数是什么

from rest_framework.decorators import action

@action 是 Django REST framework 中的一个装饰器,用于将自定义函数转换为视图集的一个动作。@action 装饰器提供了一种定义自定义函数的方式,这些函数并不直接对应于标准的 CRUD 操作(Create-Read-Update-Delete),而是实现一些其他的自定义行为或业务逻辑。
“ @action 装饰器”用于在 ViewSet 中创建自定义动作(custom action),为 ViewSet 提供了更灵活应用且 @action 只在ViewSet视图集中生效。视图集中附加action装饰器可接收两个参数:
(1)methods: 声明该action对应的请求方式.
(2)detail: True/False声明该action的路径是否是action对应的请求方式。

3.2 如何使用

views.py

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 你调用了自定义的函数")@action(detail=False, methods=['get','post'])def delete_example(self, request):name = request.data.get('name')# 删除名称为 'name' 的商品categories_to_delete = GoodsCategory.objects.filter(name=name)# 使用delete()方法删除对象deleted_count= categories_to_delete.delete()print(f"Deleted {deleted_count} categories.")      @action(detail=False, methods=['get','post'])def create_example(self, request):name = request.data.get('name')# 使用create()方法创建新的商品分类对象created_category = GoodsCategory.objects.create(name)print("Created category:", created_category)   

其中,detail=False 表示该动作不需要处理单个对象,而是处理整个集合;

@action 装饰的函数需要作为方法定义在视图集类中,并且在使用 router.register() 注册视图集时,需要指定 basename 参数,以确保该动作的 URL 能够正确映射到视图集。

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

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

相关文章

基于pyenv和virtualenv搭建python多版本虚拟环境

pyenv简介 由于Python的依赖是基于site的,这对于生产环境来说,是一种简单而正确的方式,然而,对于我们的开发环境,基于这样的管理方式,带来了可怕的第三方依赖管理的难题,virtualenv适时出现了&a…

微信小程序:单行输入和多行输入组件

微信小程序提供了两种输入类型的输入框组件&#xff0c;分别是单行输入框 <input> 和多行输入框 <textarea>。 1. 单行输入组件&#xff08;input&#xff09; 单行输入框 <input> <input> 是一个用于收集用户输入的组件&#xff0c;主要用于收集单行…

Altium Designer布局技巧

资料 快捷键 PCB导入原理图 验证工程 导入原理图 进入PCB编辑界面&#xff0c;设计→Import Changes from xxxx 多原理图多PCB 创建多个原理图、PCB 略反键点击原理图 勾选高级 选择原理图及目标PCB&#xff0c;点击确定 右键点击列表项&#xff0c;更新原理图&#xff0…

手机桌面待办事项APP推荐

每天&#xff0c;我们每个人都面临着繁琐的事务和任务&#xff0c;而手机成了我们日常生活中不可或缺的伙伴。手机上的待办事项工具像一个可靠的助手&#xff0c;可以帮助我们更好地记录、管理和完成任务。在手机桌面上使用的待办事项APP推荐用哪一个呢&#xff1f; 手机是我们…

服务容错框架Sentinel入门

概述 Sentinel&#xff0c;阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。分布式系统的流量防卫兵。 特征: 丰富的应用场景&#xff1a;秒杀&#xff08;即突发流量控制在系统…

更加轻松处理相同文件名!覆盖复制操作全新升级,避免重复命名!

亲爱的用户&#xff0c;您是否在进行覆盖复制操作时&#xff0c;常常因为相同的文件名而无法正常完成任务&#xff1f;现在&#xff0c;我们为您推出了全新的覆盖复制升级版&#xff0c;让您更加轻松处理相同文件名&#xff0c;避免重复命名的尴尬局面&#xff01; 首先第一步…

el-date-picker如何回显

后端传输过来起止时间&#xff0c;需要回显在 el-date-picker中 未修改前的代码&#xff1a; 问题整改&#xff1a;需要将时间转换为Date类型 修改后的代码 setTime(date){if (date!null){this.value.push(new Date(date.startTime))this.value.push(new Date(date.endTime))c…

环境编程代码实例:“加/卸载” Zend Framework 2

文章目录 前言代码仓库需求介绍代码说明文件结构核心片段 拓展总结参考资料作者的话 前言 环境编程代码实例&#xff1a;“加/卸载” Zend Framework 2。 代码仓库 yezhening/Environment-and-network-programming-examples: 环境和网络编程实例 (github.com)Environment-and…

【开题报告】基于SpringBoot的校园周边攻略平台的设计与实现

1.选题背景 随着大学生活的日益丰富多彩&#xff0c;校园周边的商业和文化活动也越来越丰富。然而&#xff0c;对于新生或者外地来的同学来说&#xff0c;熟悉和了解校园周边的各种信息是一件比较困难的事情。因此&#xff0c;本项目旨在开发一个校园周边攻略平台&#xff0c;…

git drop掉的commit如何找回

在 Git 中&#xff0c;如果你执行了 git reset 或 git commit --amend 等操作&#xff0c;可能会导致某些 commit 被 "drop"&#xff0c;也就是不再直接可见。这些 commit 通常会被 Git 的垃圾收集机制&#xff08;garbage collection&#xff09;删除&#xff0c;但…

C++智能指针[下](shared_ptr/weak_ptr/循环引用/删除器)

文章目录 4.智能指针[shared_ptr]4.1设计理念成员属性 4.2主要接口拷贝构造 4.3引用计数线程安全问题测试线程安全通过对计数引用的加锁保护使得类线程安全类实例化的对象使用时需要手动加锁保护 "锁"的引进线程引用传参问题 4.4整体代码 5.循环引用问题5.1问题的引入…

【adb】adb相关命令行及adb传输文件权限问题 remote couldn‘t create file: Read-only file system

adb传输文件权限问题 今天用adb push的时候&#xff0c;报错说并非root权限 remote couldnt create file: Read-only file system 以下是adb相关命令一、非root权限解决方案 1️⃣运行以下命令行 adb root adb remount2️⃣如果还报错&#xff0c;则运行以下命令行 adb disab…

项目管理中,如何建立里程碑式管理?

项目进度控制是项目管理中的重要环节&#xff0c;也是最具挑战性的工作之一。在项目管理中&#xff0c;项目进度失控受到多种因素的影响&#xff0c;导致项目失控。 为了解决这个问题&#xff0c;我们可以借鉴在旅途中学到的经验&#xff0c;通过设立里程碑来了解项目进度&am…

MSQL系列(九) Mysql实战-Join算法底层原理

Mysql实战-Join算法底层原理 前面我们讲解了BTree的索引结构&#xff0c;及Mysql的存储引擎MyISAM和InnoDB,今天我们来详细讲解下Mysql的查询连接Join的算法原理 文章目录 Mysql实战-Join算法底层原理1.Simple Nested-Loop Join 简单嵌套循环2.Block Nested-Loop Join 块嵌套…

CDN技术(1)

1. CDN简介 CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN 的作用是采用流媒体服务器集群技术&#xff0c;克服单机系统输出带宽及并发能力不足的缺点&#xff0c;可极大提升系统支持的并发流数目&#xff0c;减少或避免单点失效带来的不良影响。 2. CDN作用 CDN 利…

list列表前端分页功能已经提交list时容易犯错的问题回顾

最近在开发中&#xff0c;有返回list需要前端分页的&#xff0c;而且后续还需提交整个list&#xff0c;虽说前端分页并不难&#xff0c;但还有会有一些问题&#xff1a; 从图片代码就可以很清晰的看到前端分页&#xff0c;如何点击页数翻页的&#xff0c;很简单&#xff0c;但…

javascript判断对象中是否存在某个字段

1. in 如果指定的属性在指定的对象或其原型链中&#xff0c;则 in 运算符返回 true。 const car { make: Honda, model: Accord, year: 1998 };console.log(make in car); // truedelete car.make; if (make in car false) {car.make Suzuki; }console.log(car.make); //…

2024通信保研-电磁场电磁波复习

标量场的梯度的旋度恒等于0&#xff0c;旋度的散度等于0。 旋度&#xff1a; rot ⁡ F ( e x ∂ ∂ x e y ∂ ∂ y e z ∂ ∂ z ) ( e x F x e y F y e z F z ) e x ( ∂ F z ∂ y − ∂ F y ∂ z ) e y ( ∂ F x ∂ z − ∂ F z ∂ x ) e x ( ∂ F y ∂ x − ∂ F x …

MS COCO数据集的评价标准以及不同指标的选择推荐(AP、mAP、MS COCO、AR、@、0.5、0.75、1、目标检测、评价指标)

目标检测模型性能衡量指标、MS COCO 数据集的评价标准以及不同指标的选择推荐 0. 引言 0.1 COCO 数据集评价指标 目标检测模型通过 pycocotools 在验证集上会得到 COCO 的评价列表&#xff0c;具体参数的含义是什么呢&#xff1f; 0.2 目标检测领域常用的公开数据集 PASCAL …

网络基础知识

1.什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2.OSI 参考模型的层次是什么? 有 7 个 OSI 层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层和…