REST framework-通用视图[Generic views]
Django’s generic views… were developed as a shortcut for common usage patterns… They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of data without having to repeat yourself.
基于类的视图的主要优点之一是它们允许您编写可重用行为的部分。REST框架通过提供许多预构建的视图来利用这一点,这些视图提供了常用的模式。
通过REST框架提供的通用视图,可以快速构建与数据库模型紧密映射的API视图。
如果泛型视图不适合自己的 API 的需求,可以使用常规类,或者重用泛型视图使用的 mixin 和基类来组合成一组可重用的泛型视图。
from django.contrib.auth.models import User
from myapp.serializers import UserSerializer
from rest_framework import generics
from rest_framework.permissions import IsAdminUserclass UserList(generics.ListCreateAPIView):queryset = User.objects.all()serializer_class = UserSerializerpermission_classes = [IsAdminUser]
#对于复杂的情况,可以重写视图类中的方法
class UserList(generics.ListCreateAPIView):queryset = User.objects.all()serializer_class = UserSerializerpermission_classes = [IsAdminUser]def list(self, request):# Note the use of `get_queryset()` instead of `self.queryset`queryset = self.get_queryset()serializer = UserSerializer(queryset, many=True)return Response(serializer.data)
GenericAPIView
1.提供了基础的操作和属性:
- 支持查询集(queryset)的定义,用于指定要操作的数据集合。
- 提供了序列化器类(serializer_class)的设置,用于数据的序列化和反序列化。
2.实现了常见的方法:
- get_queryset():用于获取查询集。
- get_object():用于获取单个对象。
- lookup_field
- lookup_url_kwarg
3.支持分页:可以方便地设置分页类来处理大量数据的分页展示。(pagination_class)
4.与其他扩展类结合:常与 ListCreateAPIView、RetrieveUpdateDestroyAPIView 等结合使用,快速实现常见的 CRUD 操作。
5.过滤:filter_backends, 应用于过滤查询集的过滤器后端类的列表。默认为与设置相同的值
示例代码:
from rest_framework.generics import GenericAPIView
from rest_framework import serializers
from myapp.models import MyModel
class MyModelSerializer(serializers.ModelSerializer):class Meta:model = MyModelfields = '__all__'
class MyView(GenericAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef get(self, request, *args, **kwargs):# 自定义的获取数据逻辑pass
通过合理设置这些属性,可以更好地控制 API 处理请求和响应的数据格式,以满足不同客户端的需求。
Mixins
Mixins 为视图提供了基本的操作行为。常见的 Mixins 包括:
- ListModelMixin:提供了 list 方法,用于处理获取列表数据的请求。
- CreateModelMixin:包含 create 方法,用于处理创建新数据的请求。
- RetrieveModelMixin:提供 retrieve 方法,用于获取单个数据项。
- UpdateModelMixin:包含 update 方法,用于更新数据。
- DestroyModelMixin:提供 destroy 方法,用于删除数据。
这些 Mixins 提供的是动作方法,而不是直接定义如 get() 和 post() 这样的处理方法。这使得行为的组合更加灵活。
from rest_framework import generics
from rest_framework.mixins import ListModelMixin, CreateModelMixinclass MyResourceListCreateView(generics.GenericAPIView, ListModelMixin, CreateModelMixin):queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)
以下是一个使用 Mixins 在实际项目中创建一个简单的图书资源管理视图的示例代码:
from rest_framework import generics
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
from myapp.models import Book
from myapp.serializers import BookSerializerclass BookListView(generics.GenericAPIView, ListModelMixin, CreateModelMixin):queryset = Book.objects.all()serializer_class = BookSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)class BookDetailView(generics.GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):queryset = Book.objects.all()serializer_class = BookSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)
在上述代码中,BookListView 处理图书列表的获取和新书的创建,BookDetailView 处理单个图书的获取、更新和删除。通过结合 Mixins 和 GenericAPIView ,实现了常见的 CRUD 操作。
在实际项目中使用 Mixins 时,以下是一些需要注意的事项:
- 方法冲突:当多个 Mixins 组合使用时,要注意可能存在的方法名冲突。确保不同 Mixins 中的方法不会相互干扰或产生不一致的行为。
- 权限控制:根据具体的业务需求,合理设置视图的权限。Mixins 本身可能不会处理权限相关的逻辑,需要开发者自行添加权限验证代码。
- 数据一致性:在使用
CreateModelMixin
、UpdateModelMixin
等进行数据操作时,要确保数据的一致性和有效性验证。例如,检查必填字段、数据格式等。 - 错误处理:为 Mixins 中的操作添加适当的错误处理机制,以便在出现异常情况时能够向客户端返回清晰和有用的错误信息。
- 文档注释:由于 Mixins 增加了代码的复杂性,确保为视图类和相关方法添加清晰的文档注释,以便其他开发者能够理解其功能和使用方式。
- 版本控制:如果 API 有不同的版本,要考虑 Mixins 的使用是否在不同版本中保持一致或需要进行相应的调整。
- 性能优化:某些复杂的 Mixins 组合或频繁的数据操作可能会影响性能,需要进行性能测试和优化。
- 测试覆盖:对使用 Mixins 的视图进行充分的单元测试和集成测试,以确保其功能的正确性和稳定性。
Concrete View Classes(具体视图类)
主要的视图类:
- CreateAPIView
- ListAPIView
- RetrieveAPIView
- DestroyAPIView
- UpdateAPIView
- ListCreateAPIView
- RetrieveUpdateAPIView
- RetrieveDestroyAPIView
- RetrieveUpdateDestroyAPIView
这些具体的通用视图类为常见的操作提供了现成的实现,除非您需要高度自定义的行为,否则通常在这个级别使用它们就可以满足需求。
例如,ListCreateAPIView 结合了获取列表(list)和创建(create)的功能,RetrieveUpdateDestroyAPIView 则涵盖了获取单个对象详情(retrieve)、更新(update)和删除(destroy)的操作。
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from myapp.models import MyModel
from myapp.serializers import MyModelSerializerclass MyModelListCreateView(ListCreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializerclass MyModelRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
这样,无需自己编写每个操作的具体方法,大大减少了代码量并遵循了常见的设计模式。
以下是对这些具体视图类的介绍:
1.CreateAPIView:
- 功能:专门用于处理创建资源的请求,只支持 POST 方法。
- 示例:
from rest_framework.generics import CreateAPIView
from myapp.models import MyModel
from myapp.serializers import MyModelSerializerclass MyModelCreateView(CreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
2.ListAPIView
- 功能:用于获取资源列表,只支持 GET 方法。
- 示例:
from rest_framework.generics import ListAPIViewclass MyModelListView(ListAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
3.RetrieveAPIView
- 功能:获取单个资源的详细信息,只支持 GET 方法。
- 示例:
from rest_framework.generics import RetrieveAPIViewclass MyModelRetrieveView(RetrieveAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
4.DestroyAPIView
- 功能:用于删除单个资源,只支持 DELETE 方法。
- 示例:
from rest_framework.generics import DestroyAPIViewclass MyModelDestroyView(DestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
5.UpdateAPIView
- 功能:专门用于更新单个资源,只支持 PUT 和 PATCH 方法。
- 示例:
from rest_framework.generics import UpdateAPIViewclass MyModelUpdateView(UpdateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
6.ListCreateAPIView
- 功能:结合了获取资源列表(GET)和创建资源(POST)的功能。
- 示例:
from rest_framework.generics import ListCreateAPIViewclass MyModelListCreateView(ListCreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
7.RetrieveUpdateAPIView
- 功能:支持获取单个资源详情(GET)以及更新资源(PUT 和 PATCH)。
- 示例:
from rest_framework.generics import RetrieveUpdateAPIViewclass MyModelRetrieveUpdateView(RetrieveUpdateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
8.RetrieveDestroyAPIView
- 功能:支持获取单个资源详情(GET)和删除资源(DELETE)。
- 示例:
from rest_framework.generics import RetrieveDestroyAPIViewclass MyModelRetrieveDestroyView(RetrieveDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
9.RetrieveUpdateDestroyAPIView
- 功能:集成了获取单个资源详情(GET)、更新资源(PUT 和 PATCH)和删除资源(DELETE)的操作。
- 示例:
from rest_framework.generics import RetrieveUpdateDestroyAPIViewclass MyModelRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
Mixin
类和 Concrete View Classes
有着密切的关系。
Mixin classes
提供了特定的操作方法,如创建、读取、更新、删除和列表获取等。但它们本身并不构成完整的视图类,需要与其他类(如 GenericAPIView
)结合使用来构建完整的视图功能。
Concrete View Classes
则是已经整合了 Mixin
类和必要的基础功能的完整视图类。
在选择使用时,可以考虑以下几点:
- 如果您的需求比较简单和直接,并且符合某个
Concrete View Classes
所提供的默认行为,那么直接使用相应的Concrete View Classes
会更加便捷和高效。例如,如果您只需要实现创建资源的功能,且不需要对默认行为进行太多修改,那么CreateAPIView
就是一个很好的选择。 - 如果您的视图需要更复杂的自定义逻辑,或者需要组合多个
Mixin
类的功能以满足特定需求,那么可以从GenericAPIView
开始,并结合所需的Mixin
类来自定义视图类。 - 例如,如果您需要一个视图既能获取列表又能创建新资源,且还需要添加一些额外的自定义逻辑,那么可以选择从
GenericAPIView
结合ListModelMixin
和CreateModelMixin
来实现。
总的来说,优先考虑使用 Concrete View Classes
,只有在它们无法满足需求时,再考虑使用 Mixin
类来自定义视图。
自定义通用视图(略)
from rest_framework import generics
from rest_framework.mixins import ListModelMixin, CreateModelMixinclass CustomView(generics.GenericAPIView, ListModelMixin, CreateModelMixin):queryset = YourModel.objects.all()serializer_class = YourSerializerdef get(self, request, *args, **kwargs):return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):return self.create(request, *args, **kwargs)在上述示例中,定义了 CustomView 类,它继承自 generics.GenericAPIView 以及 ListModelMixin 和 CreateModelMixin 。
通过设置 queryset 和 serializer_class 属性来指定数据来源和序列化器。
然后,重写了 get 方法来处理获取列表的请求,调用了 ListModelMixin 的 list 方法。重写了 post 方法来处理创建新数据的请求,调用了 CreateModelMixin 的 create 方法。
相关文章:
REST framework-通用视图[Generic views]
Django’s generic views… were developed as a shortcut for common usage patterns… They take certain common idioms and patterns found in view development and abstract them so that you can quickly write common views of data without having to repeat yourself…...
行驶证OCR识别接口如何用Java调用
一、什么是行驶证OCR识别接口? 传入行驶证照片,行驶证图片上的文字信息,返回包括所有人、品牌型号、住址、车牌号、发动机号码、车辆识别代号、注册日期、发证日期等信息。 行驶证 OCR 接口的主要作用是代替手动输入,提高信息录…...

8月15日笔记
masscan安装使用 首先需要有c编译器环境。查看是否有c编译器环境: gcc -v如果系统中已经安装了 GCC,这个命令将输出 GCC 的版本信息。如果未安装,你会看到类似于 “command not found” 的错误消息。 如果没有下载,使用如下命令…...
CSS3 圆角
CSS3 圆角 引言 在网页设计中,圆角矩形是一种常见的设计元素,它们为页面带来了柔和的视觉体验。随着CSS3的推出,实现圆角矩形变得异常简单,无需依赖图片或复杂的JavaScript代码。本文将详细介绍CSS3中用于创建圆角矩形的border-…...

VUE项目中main.js中不能使用 @引入路径吗
VUE项目中main.js中不能使用 引入路径吗 vite.config已经配置了别名 但是在main.js中直接引入报错 修改成 相对路径后,保存消失 找到原因:vite.config 漏了引入 import { defineConfig } from ‘vite’ import vue from ‘vitejs/plugin-vue’ 导致…...

Spring日志
1.日志的作用 定位和发现问题(主要)系统监控数据采集日志审计...... 2.日志的使用 2.1 ⽇志格式的说明 2.2 打印日志 Spring集成了日志框架,直接使用即可 步骤: 1.定义日志对象 2.使⽤⽇志对象打印⽇志 RestController public class LoggerController {private static Logger…...

年薪30万+,TOP大厂月薪10万+....网络安全工程师凭什么?
时代飞速发展,我们的工作、生活乃至整个社会的运转都越来越依赖于网络。也因此,网络的无处不在带来了前所未有的安全风险。 从个人隐私泄露到企业机密被盗,再到国家关键基础设施遭受攻击,网络安全问题无处不在,威胁着…...
WebView 的常见的安全漏洞:
WebView 可能存在以下一些常见的安全漏洞: 跨站脚本攻击(XSS):恶意脚本可能通过网页注入到 WebView 中,从而获取用户数据或执行其他恶意操作。 跨站请求伪造(CSRF):攻击者可能诱导 …...

【python】Python中subprocess模块的参数解读以及应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

opencv-python实战项目十一:背景减除法制作运动行人蒙版
文章目录 一,简介二,背景减除法介绍三,算法实现:四,效果: 一,简介 在智能视频监控、人流量统计和运动检测等领域,背景减除法是一种常用的图像处理技术。本文将带您走进OpenCV的世界…...

安防监控/视频汇聚平台EasyCVR如何配置,实现默认获取设备的子码流?
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…...

JavaScript基础——闭包
闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中,重复声明同一个变量会导致变量冲突,在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中,闭包是指封闭的执行环境ÿ…...

Linux基础入门---安装vmware
😀前言 本篇博文是关于Linux基础入门和vmwarel5.5下载,希望你能够喜欢。 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动…...

用AppleScript点击无效,继续用pyautogui.click()
目标:点击下图中 CheckBox 元素 第一步:获取这个元素的位置,并打印出value,确认是开关是关的(value0)再继续 set targetbox to checkbox 1 of group 1 of scroll area 1 of scroll area 1 of group 1 of g…...

谈谈我用MemFire Cloud开发应用的这一两年
作为一个独立开发者,这两年我在应用开发的道路上经历了不少挑战和收获。而帮助我度过这些挑战、提高开发效率的“神器”之一,就是MemFire Cloud。如果你还没听说过这个工具,那么我今天就来和你分享一下我使用MemFire Cloud开发应用的经历&…...

AI安全-文生图
1 需求 2 接口 3 示例 大模型图像安全风险探析 - 先知社区 前言 文生图模型是一种新兴的人工智能技术,它通过对大规模文本数据的学习,能够生成逼真的图像。这种模型包含两个主要组件:一个文本编码器和一个图像生成器。 文本编码器接收文本输入,并将其转换为一种数字化的表示…...
Hibernate 使用详解
在现代的Java开发中,数据持久化是一个至关重要的环节。而在众多持久化框架中,Hibernate以其强大的功能和灵活性,成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法,希望能为广大开发者提供一些有…...

乐普医疗校招社招笔试/测评通关攻略、最新北森题库、可搜索答案
乐普医疗为什么要做笔试/测评? 笔试/测评是乐普医疗校招社招招聘流程中的必经环节,只有完成笔试/测评,候选人才有机会进入面试流程,同学们收到笔试测评通知后请尽快完成。我们给部分岗位安排了笔试,笔试的成绩对于面试官来说是很重要的参考依据,请同学们在笔试过程…...

uniapp在线下载安装包更新app
首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…...

Unity | AmplifyShaderEditor插件基础(第一集:简单了解ASE和初识)
前言 我本来老老实实的写着我的Shader,群里的小伙伴强烈建议我开始讲ASE,我只能说,我是一个听话的Up。 一、什么是ASE 全称AmplifyShaderEditor,是一个unity插件,存在于unity商城中,售价看他们心情。&am…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...