当前位置: 首页 > news >正文

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类:


1. 基础视图类

这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。
在这里插入图片描述

常用类

  1. APIView

    • 最基本的视图类,所有其他视图类都继承自它。
    • 需要手动实现 getpostputdelete 等方法。
    • 适合需要完全自定义逻辑的场景。
    from rest_framework.views import APIView
    from rest_framework.response import Responseclass MyView(APIView):def get(self, request):return Response({"message": "Hello, World!"})
    
  2. GenericAPIView

    • 继承自 APIView,提供了更多的通用功能(如 get_querysetget_serializer 等)。
    • 通常与 Mixin 类一起使用,以实现更高级的功能。
    from rest_framework.generics import GenericAPIView
    from rest_framework.response import Responseclass MyView(GenericAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef get(self, request):instances = self.get_queryset()serializer = self.get_serializer(instances, many=True)return Response(serializer.data)
    

2. 通用视图类(Generic Views)

这些视图类基于 GenericAPIView,并结合了 Mixin 类,提供了更高级的功能。

常用类

  1. ListAPIView

    • 用于实现列表视图(只读)。
    • 默认实现了 get 方法。
    from rest_framework.generics import ListAPIViewclass MyListView(ListAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  2. RetrieveAPIView

    • 用于实现详情视图(只读)。
    • 默认实现了 get 方法。
    from rest_framework.generics import RetrieveAPIViewclass MyDetailView(RetrieveAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  3. CreateAPIView

    • 用于实现创建视图。
    • 默认实现了 post 方法。
    from rest_framework.generics import CreateAPIViewclass MyCreateView(CreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  4. UpdateAPIView

    • 用于实现更新视图。
    • 默认实现了 putpatch 方法。
    from rest_framework.generics import UpdateAPIViewclass MyUpdateView(UpdateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  5. DestroyAPIView

    • 用于实现删除视图。
    • 默认实现了 delete 方法。
    from rest_framework.generics import DestroyAPIViewclass MyDeleteView(DestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  6. ListCreateAPIView

    • 结合了 ListAPIViewCreateAPIView
    • 默认实现了 getpost 方法。
    from rest_framework.generics import ListCreateAPIViewclass MyListCreateView(ListCreateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  7. RetrieveUpdateAPIView

    • 结合了 RetrieveAPIViewUpdateAPIView
    • 默认实现了 getputpatch 方法。
    from rest_framework.generics import RetrieveUpdateAPIViewclass MyRetrieveUpdateView(RetrieveUpdateAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  8. RetrieveDestroyAPIView

    • 结合了 RetrieveAPIViewDestroyAPIView
    • 默认实现了 getdelete 方法。
    from rest_framework.generics import RetrieveDestroyAPIViewclass MyRetrieveDestroyView(RetrieveDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  9. RetrieveUpdateDestroyAPIView

    • 结合了 RetrieveAPIViewUpdateAPIViewDestroyAPIView
    • 默认实现了 getputpatchdelete 方法。
    from rest_framework.generics import RetrieveUpdateDestroyAPIViewclass MyRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    

3. 视图集(ViewSets)

视图集将多个视图逻辑组合在一起,通常与路由器(Router)一起使用,自动生成 URL 配置。

常用类

  1. ViewSet

    • 类似于 APIView,但将多个操作(如 listcreateretrieve 等)组合在一起。
    • 需要手动实现各个操作。
    from rest_framework import viewsets
    from rest_framework.response import Responseclass MyViewSet(viewsets.ViewSet):def list(self, request):return Response({"message": "List view"})def create(self, request):return Response({"message": "Create view"})
    
  2. ModelViewSet

    • 继承自 GenericAPIView 和多个 Mixin 类,默认实现了完整的 CRUD 操作。
    • 适合标准的模型操作。
    from rest_framework import viewsetsclass MyModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    
  3. ReadOnlyModelViewSet

    • 继承自 ModelViewSet,但只提供只读操作(listretrieve)。
    from rest_framework import viewsetsclass MyReadOnlyViewSet(viewsets.ReadOnlyModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializer
    

4. 其他视图类

  1. GenericViewSet

    • 结合了 GenericAPIViewViewSet 的功能。
    • 通常与 @action 装饰器一起使用,定义自定义操作。
    from rest_framework import viewsets
    from rest_framework.decorators import action
    from rest_framework.response import Responseclass MyGenericViewSet(viewsets.GenericViewSet):@action(detail=False, methods=['get'])def custom_action(self, request):return Response({"message": "Custom action"})
    
  2. mixins

    • 提供了一些通用的功能(如 ListModelMixinCreateModelMixin 等),通常与 GenericAPIViewGenericViewSet 一起使用。

总结

  • 最常用的类
    • APIView:适合完全自定义逻辑。
    • ModelViewSet:适合标准的模型 CRUD 操作。
    • ListAPIViewRetrieveAPIView 等:适合简单的只读或写操作。
    • GenericAPIView:适合需要结合 Mixin 实现高级功能的场景。

相关文章:

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类: 1. 基础视图类 这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。 常用类 APIView: 最基本的视图类,所有其…...

Huatuo热更新--安装HybridCLR

1.自行安装unity编辑器 支持2019.4.x、2020.3.x、2021.3.x、2022.3.x 中任一版本。推荐安装2019.4.40、2020.3.26、2021.3.x、2022.3.x版本。 根据你打包的目标平台,安装过程中选择必要模块。如果打包Android或iOS,直接选择相应模块即可。如果你想打包…...

读书笔记 - 修改代码的艺术

读书笔记 - 修改代码的艺术 第 1 章 修改软件第 2 章 带着反馈工作系统变更方式反馈方式遗留代码修改方法 第 3 章 感知和分离伪协作程序模拟对象 第 4 章 接缝模型接缝 第 5 章 工具自动化重构工具单元测试用具 第 6 章 时间紧迫,但必须修改新生方法(Sp…...

【Go并发编程】Goroutine 调度器揭秘:从 GMP 模型到 Work Stealing 算法

每天一篇Go语言干货,从核心到百万并发实战,快来关注魔法小匠,一起探索Go语言的无限可能! 在 Go 语言中,Goroutine 是一种轻量级的并发执行单元,它使得并发编程变得简单高效。而 Goroutine 的高效调度机制是…...

c# -01新属性-模式匹配、弃元、析构元组和其他类型

文章目录 **学习摘抄分享**模式匹配概述Null 检查类型测试比较离散值关系模型多个输入ObServation列表模式弃元元组和对象析构利用switch的模式进行匹配对于out的方法调用独立弃元析构元组和其他类型元组方法一方法二方法三方法四使用弃元元组的元素使用弃元的用户定义类型解构…...

同步异步日志系统-日志落地模块的实现

功能:将格式化完成后的日志消息字符串,输出到指定的位置 扩展:支持同时将日志落地到不同的位置 位置分类: 1.标准输出 2.指定文件(时候进行日志分析) 3.滚动文件(文件按照时间/大小进行滚动…...

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源,其储量丰富,预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性,天然气水合物的探测面临诸多挑战,涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…...

类型通配符上限

主函数 package typeWildcardTop;import java.util.ArrayList;public class typeWildcardTopTest {/**/public static void main(String[] args) { // test1();test2();}/*测试showList接收ArrayList类型 ArrayList接收各种类型参数创建animals cats mincats集合 传入s…...

嵌入式音视频开发(二)ffmpeg音视频同步

系列文章目录 嵌入式音视频开发(零)移植ffmpeg及推流测试 嵌入式音视频开发(一)ffmpeg框架及内核解析 嵌入式音视频开发(二)ffmpeg音视频同步 嵌入式音视频开发(三)直播协议及编码器…...

Mongodb数据管理

Mongodb数据管理 1.登录数据库,查看默认的库 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin库:admin 是 MongoDB 的管理…...

Django 创建表 choices的妙用:get_<field_name>_display()

1.定义choices 我在创建表时,对于性别这个字段,定义了choices 选项,1代表男,2代表女 mysql中表的数据如下,里面存储的是1或2 如果我们在网页上展示的时候,想展示“男”或“女”,而不是数字1或2…...

Spring Boot 集成 Kettle

Kettle 简介 Kettle 最初由 Matt Casters 开发,是 Pentaho 数据集成平台的一部分。它提供了一个用户友好的界面和丰富的功能集,使用户能够轻松地设计、执行和监控 ETL 任务。Kettle 通过其强大的功能和灵活性,帮助企业高效地处理大规模数据集…...

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)

自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口) 一、final关键字1、认识final关键字2、final修饰变量的注意3、常量 二、单例类(设计模式)1、设计模式的概念2、单例设计模式3、单例类有很多形式4、懒汉式单例类5、小…...

Hutool - Cache:简单而强大的缓存实现

目录 1. 缓存简介 2. 引入依赖 3. 常见缓存类型及使用示例 3.1 FIFO 缓存(先进先出缓存) 3.2 LRU 缓存(最近最少使用缓存) 3.3 定时缓存 4. 缓存的基本操作 5. 总结 1. 缓存简介 在软件开发中,缓存是一种常用的…...

DeepSeek 通过 API 对接第三方客户端 告别“服务器繁忙”

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 上一期分享了如何在本地部署 DeepSeek R1 模型,但通过命令行运行的本地模型,问答的交互也要使用命令行,体验并不是很好。这期分享几个第三方客户端,涵盖了桌…...

Python 基础-循环

目录 简介 break continue 小结 简介 要计算123,我们可以直接写表达式: >>> 1 2 3 6要计算123...10,勉强也能写出来。 但是,要计算123...10000,直接写表达式就不可能了。 为了让计算机能计算成千上…...

Java和SQL测试、性能监控中常用工具

下面我会详细列举一些在Java和SQL测试、调试、性能监控中常用的工具,并结合项目中提到的各个技术点说明如何选择合适的工具和方法。 一、Java项目常用的测试、调试与性能监控工具 单元测试与集成测试:JUnit/TestNG: 用于编写单元测试和集成测…...

SQL 注入攻击详解[基础篇]:Web 应用程序安全漏洞与防御策略

目录 SQL注入的简介 现代 Web 应用程序中的数据库交互与 SQL 注入攻击 数据库管理系统(DBMS)架构与 SQL 注入 什么是 SQL 注入? SQL 注入的工作原理 SQL 注入的用例与影响 如何预防 SQL 注入? 数据库分类 数据库类型&am…...

【ArcGIS Pro二次开发】(87):样式_Style的用法

.Stylx类型的文件即为样式库文件&#xff0c;保存了符号样式。 1、根据名字获取当前工程中的style //获取当前工程中的所有style var ProjectStyles Project.Current.GetItems<StyleProjectItem>();//根据名字找出指定的style StyleProjectItem style ProjectStyles.F…...

DEX-EE三指灵巧手:扩展AI与机器人研究的边界

DEX-EE三指灵巧手&#xff0c;由Shadow Robot与Google DeepMind合作开发&#xff0c;以其先进技术和设计&#xff0c;正在引领AI与机器人研究的新趋势。其高精度传感器和灵活的机械手指&#xff0c;能够捕捉复杂的环境数据&#xff0c;为强化学习实验提供了可靠支持。 Shadow R…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...