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

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.dtcms.com/a/342979.html

相关文章:

  • 【力扣 买股票的最佳时机II Java/Python】
  • rt-thread使用sfud挂载spi flash, 并使用spi驱动st7789 lcd的trace分析(使用spi dma)
  • 生信分析自学攻略 | R语言函数与参数介绍
  • kylin v10只允许kylin用户登录解决办法
  • 雅菲奥朗SRE知识墙分享(四):『AI已开始重塑劳动力市场,美国年轻科技从业者首当其冲』
  • 数据结构-HashSet
  • 黑马程序员jbdc笔记
  • 迅为R3568开发板OpeHarmony学习开发手册-配置远程访问环境
  • mac m1上使用Kerberos访问远程linux hadoop集群的正确姿势
  • Android 定位技术全解析:从基础实现到精准优化
  • redis在Spring中应用相关
  • LeetCode算法日记 - Day 17: 算法中的位运算技巧总结
  • 【黑客技术零基础入门】硬核科普什么是HTMLHTML基本结构以及HTML基本使用(非常详细)零基础入门到精通,收藏这一篇就够了!
  • 轻量级加密的下一站:后量子、AI 与自动化验证
  • 【iOS】SDWebImage第三方库源码学习笔记
  • JupyterLab 安装(python3.10)
  • 大模型之原理篇——Transformer基础、分词器
  • 深度剖析:PCB 厚铜板铜厚检测,铜厚不足的连锁反应及检测手段
  • 性能测试中性能分析与调优学习大纲整理
  • C++中纯虚函数与普通虚函数的深度解析
  • 面试紧张情绪管理:如何保持冷静自信应对挑战
  • CLAUDE.md文件介绍(Claude Code核心配置文件,开始对话或执行任务时自动加载的上下文文件)
  • 工业大模型的应用场景
  • Ubuntu22.04设置共享文件夹
  • 2025年渗透测试面试题总结-25(题目+回答)
  • 数据库运维管理平台全面解析
  • opencv学习:图像边缘检测
  • # 重磅发布 | onecode 3.0.1 Base 源码正式开源:AI赋能的企业级开发框架
  • 算法训练营day58 图论⑧ 拓扑排序精讲、dijkstra(朴素版)精讲
  • 从零开始的Agent学习(二)-增加文档输出功能