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 實現高級功能的場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MyBatis攔截器終極指南:從原理到企業級實戰

在本篇文章中,我們將深入了解如何編寫一個 MyBatis 攔截器,并通過一個示例來展示如何在執行數據庫操作(如插入或更新)時,自動填充某些字段(例如 createdBy 和 updatedBy)信息。本文將詳細講解攔…

137,【4】 buuctf web [SCTF2019]Flag Shop

進入靶場 都點擊看看 發現點擊work會增加¥ 但肯定不能一直點下去 抓包看看 這看起來是一個 JWT(JSON Web Token)字符串。JWT 通常由三部分組成,通過點(.)分隔,分別是頭部(Header&…

twisted實現MMORPG 游戲數據庫操作封裝設計與實現

在設計 MMORPG(大規模多人在線角色扮演游戲)時,數據庫系統是游戲架構中至關重要的一部分。數據庫不僅承擔了游戲中各種數據(如玩家數據、物品數據、游戲世界狀態等)的存儲和管理任務,還必須高效地支持并發訪…

【R語言】聚類分析

聚類分析是一種常用的無監督學習方法,是將所觀測的事物或者指標進行分類的一種統計分析方法,其目的是通過辨認在某些特征上相似的事物,并將它們分成各種類別。R語言提供了多種聚類分析的方法和包。 方法優點缺點適用場景K-means計算效率高需…

超全Deepseek資料包,deepseek下載安裝部署提示詞及本地部署指南介紹

該資料包涵蓋了DeepSeek模型的下載、安裝、部署以及本地運行的詳細指南,適合希望在本地環境中高效運行DeepSeek模型的用戶。資料包不僅包括基礎的安裝步驟,還提供了68G多套獨立部署視頻教程教程,針對不同硬件配置的模型選擇建議,以…

Java Spring boot 篇:常用注解

Configuration 作用 Configuration 注解的核心作用是把一個類標記為 Spring 應用上下文里的配置類。配置類就像一個 Java 版的 XML 配置文件,能夠在其中定義 Bean 定義和 Bean 之間的依賴關系。當 Spring 容器啟動時,會掃描這些配置類,解析其…

在 Ubuntu 20.04 為 Clash Verge AppImage 創建桌面圖標教程

在 Ubuntu 20.04 為 AppImage 創建桌面圖標教程 一、準備工作 確保你已經下載了 xxxx.AppImage 文件,并且知道它所在的具體路徑。同時,你可以準備一個合適的圖標文件(.png 格式)用于代表該應用程序,如果沒有合適的圖…

【復現DeepSeek-R1之Open R1實戰】系列6:GRPO源碼逐行深度解析(上)

目錄 4 GRPO源碼分析4.1 數據類 GRPOScriptArguments4.2 系統提示字符串 SYSTEM_PROMPT4.3 獎勵函數4.3.1 accuracy_reward函數4.3.2 verify函數4.3.3 format_reward函數 4.4 將數據集格式化為對話形式4.5 初始化GRPO Trainer 【復現DeepSeek-R1之Open R1實戰】系列3&#xff1…

【雜談】加油!!!!

為了在三月底前系統準備Java后端開發的面試和筆試,以下是分階段的高效學習計劃: 一、知識體系構建(第1-2周) 核心基礎強化 Java基礎(每日1.5小時): 重點掌握:JVM內存模型&#xff0…

python旅游推薦系統+爬蟲+可視化(協同過濾算法)

??基于用戶的協同過濾算法 ??有后臺管理 ??2w多數據集 這個旅游數據分析推薦系統采用了Python語言、Django框架、MySQL數據庫、requests庫進行網絡爬蟲開發、機器學習中的協同過濾算法、ECharts數據可視化技術,以實現從網站抓取旅游數據、個性化推薦和直觀展…

HarmonyNext上傳用戶相冊圖片到服務器

圖片選擇就不用說了,直接用 無須申請權限 。 上傳圖片,步驟和android對比稍微有點復雜,可能是為了安全性考慮,需要將圖片先拷貝到緩存目錄下面,然后再上傳,當然你也可以轉成Base64,然后和服務…

同為科技智能PDU助力Deepseek人工智能和數據交互的快速發展

1 2025開年,人工智能領域迎來了一場前所未有的變革。Deepseek成為代表“東方力量”的開年王炸,不僅在國內掀起了技術熱潮,并且在全球范圍內引起了高度關注。Deepseek以顛覆性技術突破和現象級應用場景席卷全球,這不僅重塑了產業格…

二、QEMU NFS 環境搭建

? 在上一章節中,我們已經成功完成了內核和 busybox 環境的配置。為了進一步提高開發效率,我們可以使用 NFS(Network File System)來掛載根目錄。NFS 允許我們將本地文件系統通過網絡共享給虛擬機使用,這樣在開發過程中…

.NET 9.0 的 Blazor Web App 項目中 EF Core 【事務】使用備忘

一、DbContext.Database.BeginTransactionAsync() 模式 1. 注意事項:連接字符串中啟用了 MARS(Multiple Active Result Sets:MultipleActiveResultSetsTrue )后,無法創建 保存點(保存點與 SQL Server 的多…

記一次 Git Fetch 后切換分支為空的情況

Git Fetch 后切換分支為空的情況 在使用 Git 時,我遇到這樣的情況:執行 git fetch 后切換分支,發現工作目錄是空的,沒有任何文件,所以插眼記錄一下。 原因分析 git fetch 的作用:git fetch 只會從遠程倉庫…

UMLS數據下載及訪問

UMLS數據申請 這個直接在官網上申請即可,記得把地址填全,基本都會拿到lisence。 UMLS數據訪問 UMLS的數據訪問分為網頁訪問,API訪問以及數據下載后的本地訪問,網頁訪問,API訪問按照官網的指示即可,這里主…

使用 Docker 部署 Apache Spark 集群教程

簡介 Apache Spark 是一個強大的統一分析引擎,用于大規模數據處理。本文將詳細介紹如何使用 Docker 和 Docker Compose 快速部署一個包含一個 Master 節點和兩個 Worker 節點的 Spark 集群。這種方法不僅簡化了集群的搭建過程,還提供了資源隔離、易于擴…

瑞薩RA-T系列芯片ADCGPT功能模塊的配合使用

在馬達或電源工程中,往往需要采集多路AD信號,且這些信號的優先級和采樣時機不相同。本篇介紹在使用RA-T系列芯片建立馬達或電源工程時,如何根據需求來設置主要功能模塊ADC&GPT,包括采樣通道打包和分組,GPT觸發啟動…

20250217 隨筆 redis非原子性操作簡述

從你提供的文本來看,核心是 Redis 作為緩存的檢查機制,以及非原子性操作導致的不一致性問題。 我們可以拆解為兩個部分來理解: 📌 1. 邏輯:先查 Redis,再決定是否注冊 邏輯流程 先查詢 Redis 是否有某個 …

git-提交時間和作者時間的區別

1.介紹 定義介紹 提交時間(Committer Date):決定了提交在 Git 歷史中的位置,通常影響 GitHub 上提交顯示的順序。 作者時間(Author Date):雖然不影響提交的排序,但在每個提交詳情頁…