DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)

DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)

目录

  • DRF视图组件(2个视图基类、5个视图扩展类、9个视图子类、视图集和路由映射)
    • 2个视图基类
    • mixins的5个视图扩展类
    • generics的9个视图子类
    • 视图集
    • 自定制返回格式
    • 自动生成路由(SimpleRouter)
    • action装饰器

2个视图基类

APIView写法:

from rest_framework.views import APIViewclass publish(APIView):def get(self, request):publish_obj = models.Publish.objects.all()serializer = PublishSerializer(instance=publish_obj, many=True)return Response({'code': '200', 'msg': '查询成功', 'result': serializer.data})def post(self, request):serializer = PublishSerializer(data=request.data)if serializer.is_valid():serializer.save()return Response({'code': '200', 'msg': '添加成功', 'result': serializer.data})else:return Response({'code': '900', 'msg': serializer.errors})class publish_detail(APIView):def get(self, request, u_id):publish_obj = models.Publish.objects.get(id=u_id)serializer = PublishSerializer(instance=publish_obj)return Response({'code': '200', 'msg': '查询成功', 'result': serializer.data})def delete(self, request, u_id):passdef put(self, request, u_id):publish_obj = models.Author.objects.filter(pk=u_id).first()# 改对象必须传data和instanceserializer = PublishSerializer(instance=publish_obj, data=request.data)if serializer.is_valid():serializer.save()return Response({'code': '200', 'msg': "修改成功", 'result': serializer.data})else:return Response({'code': '201', 'msg': serializer.errors})

GenericAPIView类改写:

from rest_framework.generics import GenericAPIViewclass publish(GenericAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerializerdef get(self, request):publish_obj = self.get_queryset()serializer = self.get_serializer(instance=publish_obj, many=True)return Response({'code': '200', 'msg': '查询成功', 'result': serializer.data})def post(self, request):serializer = self.get_serializer(data=request.data)if serializer.is_valid():serializer.save()return Response({'code': '200', 'msg': '添加成功', 'result': serializer.data})else:return Response({'code': '900', 'msg': serializer.errors})class publish_detail(GenericAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerializerdef get(self, request, pk):publish_obj = self.get_object()serializer = self.get_serializer(instance=publish_obj)return Response({'code': '200', 'msg': '查询成功', 'result': serializer.data})def delete(self, request, pk):self.get_object().delete()return Response({'code': '200', 'msg': '删除成功'})def put(self, request, pk):publish_obj = self.get_object()# 改对象必须传data和instanceserializer = self.get_serializer(instance=publish_obj, data=request.data)if serializer.is_valid():serializer.save()return Response({'code': '200', 'msg': "修改成功", 'result': serializer.data})else:return Response({'code': '201', 'msg': serializer.errors})
  • queryset = models.Publish.objects.all():查询所有数据
  • serializer_class = PublishSerializer:获取序列化类(本文未展示)
  • publish_obj = self.get_queryset():获取所有数据
  • serializer = self.get_serializer(instance=publish_obj, many=True):使用定义好的序列化类
  • self.get_object():这里不需要传入pk,直接用它定义好的方法,但是它默认识别的只有pk,取其他名会报错

mixins的5个视图扩展类

  • CreateModelMixin:新增

  • ListModelMixin:查询所有

  • DestroyModelMixin:删除单条

  • UpdateModelMixin:修改单条

  • RetrieveModelMixin:查询单条

from rest_framework.generics import GenericAPIView
from rest_framework.mixins import CreateModelMixin, ListModelMixin, DestroyModelMixin, RetrieveModelMixin, \UpdateModelMixinclass publish(GenericAPIView, CreateModelMixin, ListModelMixin):queryset = models.Publish.objects.all()serializer_class = PublishSerializerdef get(self, request):res = super().list(request)return Response({'code': '200', 'msg': '查询成功', 'result': res.data})def post(self, request):res = super().create(request)print(type(res))return Response({'code': '200', 'msg': '添加成功', 'result': res.data})class publish_detail(GenericAPIView, RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin):queryset = models.Publish.objects.all()serializer_class = PublishSerializerdef get(self, request, *args, **kwargs):res = super().retrieve(request, *args, **kwargs)return Response({'code': '200', 'msg': '查询成功', 'result': res.data})def delete(self, request, *args, **kwargs):res = super().destroy(request, *args, **kwargs)return Response({'code': '200', 'msg': '删除成功'})def put(self, request, *args, **kwargs):res = super().update(request, *args, **kwargs)return Response({'code': '200', 'msg': "修改成功", 'result': res.data})
  • res = super().list(request):调用ListModelMixin类中的list方法可以省去查询数据和序列化的书写,下面的都一样
  • 注:res是一个 Response 实例,而不是一个序列化器实例,因此对返回值调用 .is_valid()之类的方法会报AttributeError

generics的9个视图子类

  • CreateAPIView:新增
  • DestroyAPIView:删除
  • ListAPIView:查询所有
  • ListCreateAPIView:查询所有和新增的合并
  • RetrieveAPIView:查询单个
  • RetrieveDestroyAPIView:查询单个和删除的合并
  • RetrieveUpdateAPIView:查询单个和修改的合并
  • RetrieveUpdateDestroyAPIView:查询单个、修改和删除的合并
  • UpdateAPIView:修改
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIViewclass publish(ListCreateAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerializerclass publish_detail(RetrieveUpdateDestroyAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerializer

视图集

# views.py
from rest_framework.viewsets import ModelViewSetclass publish(ModelViewSet):queryset = models.Publish.objects.all()serializer_class = PublishSerializer
# urls.py
from django.contrib import admin
from django.urls import path
from app import viewsurlpatterns = [path('publish/', views.publish.as_view({'get': 'list', 'post': 'create'})),path('publish/<str:pk>/', views.publish.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
  • 此时就不需要再分一个publish_detail类了,ModelviewSet已经帮你把五个接口全部写好了,只需在路由层添加映射
  • 'get': 'list':表示遇到get请求时执行list方法,其他的也是

自定制返回格式

  • 不管是视图子类还是视图集,需要自定制返回字段时只需重写所需方法就行

  • 例如我要自定制查询所有的返回值就重写list:

class publish(ListCreateAPIView):queryset = models.Publish.objects.all()serializer_class = PublishSerializerdef list(self, request, *args, **kwargs):res = super().list(request, *args, **kwargs)res.data = {"code": 200, "msg": "查询成功", "result": res.data}return Response(res.data)
  • res.data默认返回的是一个包含多个字典的列表

自动生成路由(SimpleRouter)

# urls.py
from rest_framework.routers import SimpleRouter
from app import views# 实例对象
router = SimpleRouter()
# 将publish类注册,最左边的publish为浏览器输入的路由,最右边的publish是别名
router.register('publish', views.publish, 'publish')urlpatterns = [
]
# 将注册好的路由添加进urlpatterns

现在得到的路由其实就是http://127.0.0.1:8000/publish/,调用的视图类是publish,并且pk它也会自动帮你写好

与SimpleRouter类似的还有DefaultRouter,他俩基本用法完全一致,唯一不同的是DefaultRouter会返回一个根路径

  • SimpleRouter
image-20240415205837533
  • DefaultRouter
image-20240415205916923

点进Api Root后可以看到它返回了一个根路径

{"publish": "http://127.0.0.1:8000/publish/"
}

action装饰器

SimpleRouter自动生成路由后有一个弊端就是当绑定的类中没有get\path这种方法名时会注册失败

例如我现在有一个login方法,我想让他接受get请求实现查询单个的功能要,只需在上面价加个action装饰器

# views.py
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import actionclass publish(ModelViewSet):@action(methods=['GET'], detail=False)def login(self, request)

action参数:(methods=None, detail=None, url_path=None, url_name=None, **kwargs):

  • methods:包含被允许的请求方法
  • detail:指定是否需要提供对象的详细信息
  • url_path:指定自定义的 URL 路径
  • url_name:指定自定义的 URL 名称

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

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

相关文章

[lesson30]操作符重载的概念

操作符重载的概念 操作符重载 C中的重载能够扩展操作符的功能 操作符的重载以函数的方式进行 本质&#xff1a; 用特殊形式的函数扩展操作符的功能 通过operator关键字可以定义特殊的函数 operator的本质是通过函数重载操作符 语法&#xff1a; 可以将操作符重载函数定…

Android RecyclerView性能优化及Glide流畅加载图片丢帧率低的一种8宫格实现,Kotlin

Android RecyclerView性能优化及Glide流畅加载图片丢帧率低的一种8宫格实现&#xff0c;Kotlin <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permission.READ_MEDIA_IMAGES&qu…

c# 服务创建

服务 创建服务 编写服务 可以对server1.cs重新命名&#xff0c;点击你的server按F7进入代码编辑模式&#xff0c;编写脚本 双击你的server.cs右击空白位置&#xff0c;添加安装程序&#xff0c;此时会生成“serviceInstaller1”及“serviceProcessInstaller1” 后续可以点击P…

faker 伪造数据生成库

faker 伪造数据生成库 前言 javafaker&#xff0c;这是一个用于生成假数据的 Java 库&#xff0c;与 Python 的 faker 库类似。javafaker 库提供了很多方法&#xff0c;用于生成各种类型的随机数据&#xff0c; 基本用法 api介绍 <!--java faker用于生成随机数据-->&…

使用AI动作捕捉制作动画图像——Viggle AI教程

使用AI动作捕捉制作动画图像——Viggle AI教程 在数字媒体时代&#xff0c;动画制作已经成为一种流行的艺术形式。最近&#xff0c;我在网上发现了一个非常有趣的AI动画制作工具——Viggle AI。这个工具不仅简单易用&#xff0c;而且目前还是免费的。在这篇博客中&#xff0c;我…

护眼台灯哪个牌子最好,护眼台灯品牌排行榜分享

​护眼台灯哪个牌子最好&#xff1f;尽管一些家长可能对护眼台灯还不甚了解&#xff0c;下面我将介绍这类台灯的几个显著优势&#xff1a;它们专为减少眼睛疲劳和保护视力而设计&#xff0c;提供稳定且柔和的光线&#xff1b;具备灵活的亮度调节功能&#xff0c;适应不同的阅读…

springMVC理解

springMVC是一种思想&#xff0c;将软件划分为&#xff0c;模型Model&#xff0c;视图View&#xff0c;控制器Controller。 MVC的工作原理&#xff1a;用户通过前端视图页面&#xff0c;发送请求到服务器&#xff0c;在服务器中请求被Controller接收&#xff0c;Controller调用…

使用PL\SQL将Excel表格导入到oracle数据库中

因为要测试生产问题&#xff0c;需要把生产上oracle导出数据导入到测试环境oracle数据库中&#xff0c;尝试了N种方法&#xff0c;发现使用PL\SQL 的ODBC 方法比较好用 1、开始 首先使用plsqldev里面的&#xff0c;工具--》下面的odbc导入器 2、配置 点击之后&#xff0c;会…

OpenHarmony轻量系统开发【2】源码下载和开发环境

2.1源码下载 关于源码下载的&#xff0c;读者可以直接查看官网&#xff1a; https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes 本文这里做下总结&#xff1a; &#xff08;1&#xff09;注册码云gitee账号。 &#xff08;2&#xff09;注册码云SSH公钥…

weblogic oracle数据源配置

在weblogic console中配置jdbc oracle数据源 1. base_domain->Service->DataSources 在Summary of JDBC Data Sources中&#xff0c;点击New, 选择【Generic Data Source】通用数据源。 2. 设置数据源Name和JNDI name 注&#xff1a;设置的JNDI Name是Java AP中连接…

用于 SQLite 的异步 I/O 模块(二十四)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite的PRAGMA 声明&#xff08;二十三&#xff09; 下一篇&#xff1a;SQLite、MySQL 和 PostgreSQL 数据库速度比较&#xff08;本文阐述时间很早比较&#xff0c;不具有最新参考性&#xff09;&#xff08;二…

C#医学实验室/检验信息管理系统(LIS系统)源码

目录 检验系统的总体目标 LIS主要包括以下功能&#xff1a; LIS是集&#xff1a;申请、采样、核收、计费、检验、审核、发布、质控、耗材控制等检验科工作为一体的信息管理系统。LIS系统不仅是自动接收检验数据&#xff0c;打印检验报告&#xff0c;系统保存检验信息的工具&a…

使用Hugo、Github Pages搭建自己的博客

文章目录 搭建博客框架及对比使用Hugo搭建博客使用Github Pages部署博客 搭建博客框架及对比 在众多的博客框架中&#xff0c;Hugo、Jekyll和Hexo因其出色的性能和易用性而备受推崇。 特点HugoJekyllHexo速度极高中等较高易用性高中等高&#xff08;熟悉JavaScript者&#xf…

书生·浦语大模型全链路开源体系-第5课

书生浦语大模型全链路开源体系-第5课 书生浦语大模型全链路开源体系-第5课相关资源LMDeploy基础配置LMDeploy运行环境下载internlm2-chat-1_8b模型使用Transformer来直接运行InternLM2-Chat-1.8B模型使用LMDeploy以命令行方式与InternLM2-Chat-1.8B模型对话设置KV Cache最大占用…

数据结构--栈,队列,串,广义表

3.栈 &#xff08;先进后出&#xff09; 栈是一种特殊的线性表&#xff0c;只能从一端插入或删除操作。 4.队列 4.1 4.1.1初始化 4.1.2判断队列是否为空 4.1.3判断队列是否为满 4.1.4入队 4.1.5出队 4.1.6打印队列 4.1.7销毁队列 5.串 5.1 串的定义 由零个或者任意多…

【安全】查杀linux上c3pool挖矿病毒xmrig

挖矿平台&#xff1a;猫池 病毒来源安装脚本 cat /root/c3pool/config.jsoncrontab -r cd /root/c3poolcurl -s -L http://download.c3pool.org/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALLen_US.UTF-8 bash -s 44SLpuV4U7gB6RNZMCweHxWug7b1YUir4jLr3RBaVX33Qxj…

vue实现前端打印效果

如图效果所示&#xff08;以下演示代码&#xff09; <template><div><el-button v-print"printObj" type"primary" plain click"handle">{{ text }}</el-button><div style"display: none"><div id…

224 基于matlab的优化工具箱优化函数

基于matlab的优化工具箱优化函数&#xff0c; 此工具箱中提供的算法包括&#xff1a; 灰狼优化器&#xff08;GWO&#xff09;&#xff0c;蚂蚁狮子优化器&#xff08;ALO&#xff09;&#xff0c;多功能优化器&#xff08;MVO&#xff09;&#xff0c;蜻蜓算法&#xff08;DA&…

【模拟】Leetcode 替换所有的问号

题目讲解 1576. 替换所有的问号 算法讲解 这里有两个特殊情况&#xff1a;如果&#xff1f;在第一个位置&#xff0c;只需要判断后面的符号&#xff1b; 如果&#xff1f;在最后一个位置&#xff0c;只需要判断前面的符号 class Solution { public:string modifyString(stri…

七月审稿之提升模型效果的三大要素:prompt、数据质量、训练策略(含Reviewer2和PeerRead)​

前言 我带队的整个大模型项目团队超过40人了&#xff0c;分六个项目组&#xff0c;每个项目组都是全职带兼职&#xff0c;且都会每周确定任务/目标/计划&#xff0c;然后各项目组各自做任务拆解&#xff0c;有时同组内任务多时 则2-4人一组 方便并行和讨论&#xff0c;每周文档…