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…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
VASP软件在第一性原理计算中的应用-测试GO
VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件,广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算ÿ…...
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...
组合模式:构建树形结构的艺术
引言:处理复杂对象结构的挑战 在软件开发中,我们常遇到需要处理部分-整体层次结构的场景: 文件系统中的文件与文件夹GUI中的容器与组件组织结构中的部门与员工菜单系统中的子菜单与菜单项组合模式正是为解决这类问题而生的设计模式。它允许我们将对象组合成树形结构来表示&…...
