Django REST框架核心:GenericAPIView详解

Django REST framework (DRF)GenericAPIView 的源码核心部分。

  • 它是所有“泛型视图”的基础类,比如常用的 ListAPIViewRetrieveAPIViewCreateAPIView 都是继承自它。

🌟 作用

  • 继承自 APIView,因此仍然是一个标准的 DRF 视图。

  • 提供了常用的“通用逻辑”:

    • 统一获取 queryset
    • 统一获取 serializer
    • 提供 对象查找get_object
    • 提供 分页paginate_queryset / get_paginated_response
    • 提供 过滤filter_queryset
  • 它本身不实现 get/post/put/delete 等 HTTP 方法,而是作为“基类”让子类在此之上去扩展。

在这里插入图片描述

🔑 关键点解析

1. querysetget_queryset

def get_queryset(self):assert self.queryset is not Nonequeryset = self.querysetif isinstance(queryset, QuerySet):queryset = queryset.all()  # 确保每次请求都是新 QuerySetreturn queryset
  • 必须设置 queryset 或重写 get_queryset
  • 一般推荐重写 get_queryset 来根据 用户/请求参数 动态返回不同数据。
  • 注意不要直接用 self.queryset,否则会因为缓存导致跨请求数据不一致。

2. serializer_classget_serializer_class

def get_serializer(self, *args, **kwargs):serializer_class = self.get_serializer_class()kwargs.setdefault('context', self.get_serializer_context())return serializer_class(*args, **kwargs)
  • 必须指定 serializer_class 或重写 get_serializer_class
  • 可以根据用户角色、请求方法等动态选择不同序列化器。

3. get_object

def get_object(self):queryset = self.filter_queryset(self.get_queryset())lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_fieldfilter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}obj = get_object_or_404(queryset, **filter_kwargs)self.check_object_permissions(self.request, obj)return obj
  • 用来获取某一个具体对象(常用于 RetrieveAPIViewUpdateAPIView)。
  • 默认按 pk 查找,可以改 lookup_field = 'slug' 之类。
  • 自动做 权限检查

4. 过滤与分页

  • filter_queryset(queryset):遍历 filter_backends,按配置的 filter backend 处理,比如 DjangoFilterBackendSearchFilterOrderingFilter
  • paginate_queryset(queryset):按 pagination_class 分页,比如 PageNumberPagination
  • get_paginated_response(data):返回带分页信息的 Response。

✅ 使用示例

比如写一个获取用户文章的 API:

from rest_framework.generics import ListAPIView, RetrieveAPIView
from .models import Article
from .serializers import ArticleSerializerclass ArticleListView(ListAPIView):serializer_class = ArticleSerializerdef get_queryset(self):# 只展示当前用户的文章return Article.objects.filter(author=self.request.user)class ArticleDetailView(RetrieveAPIView):queryset = Article.objects.all()serializer_class = ArticleSerializerlookup_field = "slug"   # 用 slug 查找

这样 ListAPIView / RetrieveAPIView 都是基于 GenericAPIView 实现的。


👉 总结:
GenericAPIView 本身不会直接用,而是作为“可复用的基类”,把 queryset / serializer / 过滤 / 分页 / 查找对象 的逻辑抽象好,供其他泛型视图使用。

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

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

相关文章

深入解析HashMap的存储机制:扰动函数、哈希计算与索引定位

今天复习了一下HashMap的部分,写一篇博客记录一下今天学习内容虽然之前学习过,但由于后来没怎么使用过而且也没复习基本忘得差不多了在Java的HashMap中,高效存储键值对的核心在于哈希算法和索引定位。本文将结合源码逐步拆解存储流程&#xf…

【机器学习 / 深度学习】基础教程

阶段一:机器学习 / 深度学习基础教程定位:针对准备进入 AI多智能体开发 的初学者,打牢机器学习与深度学习的基础。一、为什么需要学习机器学习/深度学习 在进入智能体(Agent)开发之前,必须具备一定的 机器学…

ESP32应用——HTTP client(ESP-IDF框架)

目录 一、前言 二、URL 2.1 URL简介 2.2 URL示例 三、HTTP 3.1 HTTP协议概述 3.2 HTTP的工作原理 3.2.1 HTTP 请求-响应流程 3.2.2 HTTP 请求结构 3.2.3 HTTP请求方法 3.2.4 HTTP响应结构 3.2.5 HTTP状态码 四、ESP HTTP 客户端流程 五、ESP HTTP 客户端实战解析…

动学学深度学习07-现代卷积神经网络

动学学深度学习pytorch 参考地址:https://zh.d2l.ai/ 文章目录动学学深度学习pytorch1-第07章-现代卷积神经网络1. AlexNet1.1 AlexNet 的核心贡献是什么?1.2 AlexNet 与 LeNet 的主要区别有哪些?1.3 为什么 AlexNet 需要 GPU 训练&#xff1…

详细讲解Java中的反射和经典面试题(保姆级别)

1.1 反射的概述:专业的解释(了解一下):是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意属性和方法;这种动态获取…

MyCAT完整实验报告

MyCAT完整实验报告 ‍ 前言 刚刚看了一下前面的那篇MyCAT的文章 感觉有一些问题 所以拿出一篇文章再说一下 单独构建了完整的实验环境 这样会全面一点 ‍ 安装MyCAT #跳过‍ 主从配置 #不多追溯 因为我们选择的主从 也可以做双主机 但我们后边再说‍ 环境搭建 一、环境规划 服务…

机器翻译论文阅读方法:顶会(ACL、EMNLP)论文解析技巧

更多内容请见: 机器翻译修炼-专栏介绍和目录 文章目录 一、论文选择:快速判断论文价值 1.1 关注核心会议与子领域 1.2 筛选标准 1.3 预读筛选 1.4 快速定位关键信息 二、精读解析 2.1 问题定义(5分钟) 2.2 方法解剖(15分钟) 2.3 实验深挖(20分钟) 2.4 批判性思考(10分…

Transformer模型实战篇

引入 基于Transformers的NLP解决方案的步骤如下:(以文本分类为例) 导入相关包,General,可以询问ai需要导什么包加载数据集,Data_loader,Datasets数据集划分,测试机,验证集…

深入(流批【牛批】框架)Flink的机制

flink本身是专注有状态的无限流处理,有限流处理【batch批次】是无限流处理的一中特殊情况!应用场景实时ETL 集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据进行实时清洗、归并和结构化 处理;同时,对离线…

Git 2.15.0 64位安装步骤Windows详细教程从下载到验证(附安装包下载)

一、下载后双击运行 安装包下载:https://pan.quark.cn/s/7200b32a1ecf,找到下载好的文件:​Git-2.15.0-64-bit.exe​双击这个文件,就会弹出安装向导窗口,点 ​​“Next”(下一步)​​ 二、选择…

在职老D渗透日记day23:sqli-labs靶场通关(第29关-31关)http参数过滤

5.29.第29关 http参数过滤 闭合5.29.1.手动注入(1)判断注入类型、注入点闭合(2)有回显,优先用联合查询注入,判读字段数?id1&id2 order by 3 -- ?id1&id2 order by 4 --(3)…

Spring Boot整合Amazon SNS实战:邮件订阅通知系统开发

Spring Boot整合Amazon SNS实战引言配置服务总结新用户可获得高达 200 美元的服务抵扣金 亚马逊云科技新用户可以免费使用亚马逊云科技免费套餐(Amazon Free Tier)。注册即可获得 100 美元的服务抵扣金,在探索关键亚马逊云科技服务时可以再额…

LeetCode_动态规划1

动态规划1.动态规划总结1.1 01背1.1.1 二维数组1.1.2 一维数组1.2 完全背包2.斐波那契数(力扣509)3.爬楼梯(力扣70)4.使用最小花费爬楼梯(力扣746)5.不同路径(力扣62)6.不同路径 II(力扣63)7.整数拆分(力扣343)8.不同的二叉搜索树(力扣96)9.分割等和子集(力扣416)10.最后一块石…

【STM32】HAL库中的实现(九):SPI(串行外设接口)

SPI 接口通信原理 SPI(Serial Peripheral Interface)是全双工主从通信协议,特点是: 信号线功能SCK串行时钟MOSI主设备输出,从设备输入MISO主设备输入,从设备输出CS(NSS)片选信号&am…

Git常用操作大全(附git操作命令)

Git常用操作大全 一、基础配置 1.1 设置用户名和邮箱 git config --global user.name "你的名字" git config --global user.email "你的邮箱"1.2 查看配置 git config --list二、仓库管理 2.1 初始化本地仓库 git init2.2 克隆远程仓库 git clone <仓库…

详解flink table api基础(三)

文章目录1.使用flink的原因&#xff1a;2. Flink支持两种模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select语句&flink table api&#xff1a;6. 使用flink table api 创建table7. 使用flink table api 写流式数据输出到表或sink8.…

Vue2+Vue3前端开发_Day5

参考课程: 【黑马程序员 Vue2Vue3基础入门到实战项目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定义指令 基本语法&#xff08;全局 & 局部注册&#xff09; 介绍&#xff1a;自己定义的指令&#xff0c;可以封装一些 DOM 操作&#xff0c…

机器学习--决策树2

目录 第一代裁判&#xff1a;ID3 与信息增益的 “偏爱” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指数” 新思路 遇到连续值&#xff1f;先 “砍几刀” 再说 给决策树 “减肥”&#xff1a;剪枝的学问 动手试试&#xff1…

yggjs_react使用教程 v0.1.1

yggjs_react是一个用于快速创建React项目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等现代前端技术栈&#xff0c;帮助开发者快速搭建高质量的React应用。 快速入门 快速入门部分将指导您如何安装yggjs_react工具、创建新项目并启动开发服务器。 安…

vulhub可用的docker源

这一块不太容易找&#xff0c;我试了好几个源&#xff0c;下面是20250820测试可用源 编辑方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置内容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…