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
英文地址,請注明出處:http://en.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-…