【Python】DRF核心組件詳解:Mixin與Generic視圖

在 Django REST Framework (DRF) 中,mixins.CreateModelMixinmixins.ListModelMixinGenericAPIViewGenericViewSet 是構建 API 視圖的核心組件。以下是對這些組件的主要方法及其職責的簡要說明,內容清晰且結構化:


1. mixins.CreateModelMixin

職責:提供創建模型實例的功能,通常用于處理 POST 請求以創建新的資源。

主要方法

  • create(request, *args, **kwargs)
    • 功能:處理 POST 請求,創建并保存新的模型實例。
    • 流程
      1. 使用序列化器驗證請求數據。
      2. 如果數據有效,調用 perform_create 保存實例。
      3. 返回 201 Created 響應,包含創建的資源數據。
    • 返回值:Response 對象,包含序列化后的新創建對象數據。
  • perform_create(serializer)
    • 功能:執行實際的保存操作,供子類重寫以添加自定義邏輯(如設置創建者的用戶 ID)。
    • 默認行為:調用 serializer.save() 保存實例。

使用場景:實現“創建”功能,如添加新用戶、新文章等。


2. mixins.ListModelMixin

職責:提供列出所有資源的功能,通常用于處理 GET 請求以返回模型實例列表。

主要方法

  • list(request, *args, **kwargs)
    • 功能:處理 GET 請求,返回查詢集的序列化數據。
    • 流程
      1. 獲取查詢集(通過 get_queryset())。
      2. 可選地應用分頁(通過 paginate_queryset)。
      3. 使用序列化器序列化查詢集。
      4. 返回序列化數據(分頁或非分頁)。
    • 返回值:Response 對象,包含序列化后的對象列表。

使用場景:列出資源列表,如獲取所有用戶、所有文章等。


3. GenericAPIView

職責:DRF 的通用視圖基類,提供了核心功能(如查詢集、序列化器、分頁等)的配置和處理邏輯,適合自定義視圖。

主要方法

  • get_queryset()
    • 功能:返回視圖使用的查詢集。
    • 默認行為:使用類屬性 queryset 或需要子類重寫。
  • get_serializer_class()
    • 功能:返回視圖使用的序列化器類。
    • 默認行為:使用類屬性 serializer_class 或需要子類重寫。
  • get_serializer(*args, **kwargs)
    • 功能:實例化并返回序列化器對象。
  • filter_queryset(queryset)
    • 功能:對查詢集應用過濾、分頁等操作。
    • 默認行為:調用 filter_backends 進行過濾。
  • paginate_queryset(queryset)
    • 功能:對查詢集進行分頁處理。
    • 返回值:分頁后的查詢集或 None(無分頁時)。

其他職責

  • 提供分頁、過濾、權限檢查等基礎設施。
  • 支持動態配置序列化器和查詢集,靈活性高。

使用場景:需要自定義視圖邏輯時使用,結合 Mixins 或直接重寫方法。


4. GenericViewSet

職責:繼承自 GenericAPIViewViewSet,提供更高級別的視圖集功能,支持路由器自動生成 URL 路由,適合快速構建 RESTful API。

主要方法

  • 繼承了 GenericAPIView 的所有方法(如 get_querysetget_serializer_class 等)。
  • 額外提供 ViewSet 的特性:
    • as_view():動態綁定 HTTP 方法(如 GET、POST)到視圖方法(如 listcreate)。
    • 支持路由器(如 DefaultRouter)自動生成 URL 模式。
  • 通常與 Mixins 組合使用(如 CreateModelMixinListModelMixin)來實現具體功能。

職責擴展

  • 不直接綁定 HTTP 方法到 URL,需要通過路由器或手動配置。
  • 提供更大的靈活性,適合復雜 API(如支持多種操作的資源)。

使用場景:快速構建 RESTful API,結合路由器生成標準化的 URL 模式。


總結對比

組件主要方法職責概述使用場景
CreateModelMixincreate, perform_create處理 POST 請求,創建新資源創建資源(如添加新用戶)
ListModelMixinlist處理 GET 請求,返回資源列表列出資源(如獲取所有文章)
GenericAPIViewget_queryset, get_serializer_class, etc.提供查詢集、序列化器等核心功能,供自定義視圖自定義復雜視圖邏輯
GenericViewSet繼承 GenericAPIView 方法 + ViewSet 特性結合 Mixins 和路由器快速構建 RESTful API快速開發標準化的 RESTful API

注意事項

  1. Mixin 需要結合 GenericAPIViewViewSet:Mixins 不獨立使用,需與 GenericAPIView 或其子類(如 GenericViewSet)組合。
  2. 路由器與 ViewSetGenericViewSet 常與 DRF 的 DefaultRouter 配合,自動生成 RESTful URL 模式。
  3. 自定義擴展:可通過重寫 perform_createget_queryset 等方法添加自定義邏輯。
  4. 序列化器與查詢集GenericAPIViewGenericViewSet 需要明確指定 querysetserializer_class,否則需重寫對應方法。

代碼

以下是一個展示 Django REST Framework 中 mixins.CreateModelMixinmixins.ListModelMixinGenericAPIViewGenericViewSet 使用方式的代碼示例。代碼基于一個簡單的博客應用,包含模型、序列化器和視圖,涵蓋這些組件的主要方法和職責。

# models.py
from django.db import modelsclass Post(models.Model):title = models.CharField(max_length=100)content = models.TextField()created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.title# serializers.py
from rest_framework import serializers
from .models import Postclass PostSerializer(serializers.ModelSerializer):class Meta:model = Postfields = ['id', 'title', 'content', 'created_at']# views.py
from rest_framework import mixins, generics, viewsets
from rest_framework.response import Response
from .models import Post
from .serializers import PostSerializer# 使用 GenericAPIView 結合 Mixins
class PostListCreateView(generics.GenericAPIView, mixins.ListModelMixin, mixins.CreateModelMixin):queryset = Post.objects.all()serializer_class = PostSerializerdef get(self, request, *args, **kwargs):# 調用 ListModelMixin 的 list 方法return self.list(request, *args, **kwargs)def post(self, request, *args, **kwargs):# 調用 CreateModelMixin 的 create 方法return self.create(request, *args, **kwargs)def perform_create(self, serializer):# 自定義 create 邏輯,例如添加當前用戶serializer.save()  # 簡單保存,實際可添加 user=request.user# 使用 GenericViewSet 結合 Mixins
class PostViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):queryset = Post.objects.all()serializer_class = PostSerializerdef perform_create(self, serializer):# 自定義 create 邏輯serializer.save()  # 可擴展為保存額外字段# urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import PostListCreateView, PostViewSet# 路由器用于 ViewSet
router = DefaultRouter()
router.register(r'posts', PostViewSet)urlpatterns = [# GenericAPIView + Mixins 的路由path('posts/list-create/', PostListCreateView.as_view(), name='post-list-create'),# ViewSet 的路由path('', include(router.urls)),
]

代碼說明

  1. 模型和序列化器

    • Post 模型定義了博客文章的基本字段。
    • PostSerializer 用于序列化和反序列化 Post 模型數據。
  2. PostListCreateView(GenericAPIView + Mixins)

    • 繼承 GenericAPIViewListModelMixinCreateModelMixin
    • get 方法調用 list 方法(來自 ListModelMixin),處理 GET 請求,返回文章列表。
    • post 方法調用 create 方法(來自 CreateModelMixin),處理 POST 請求,創建新文章。
    • 重寫了 perform_create 方法,可添加自定義保存邏輯。
  3. PostViewSet(GenericViewSet + Mixins)

    • 繼承 GenericViewSetCreateModelMixinListModelMixin
    • 通過路由器自動生成 /posts/(GET 列出)和 /posts/(POST 創建)的路由。
    • 同樣支持 perform_create 自定義邏輯。
  4. URL 配置

    • PostListCreateView 使用手動定義的 URL 路由。
    • PostViewSet 使用 DRF 的 DefaultRouter 自動生成 RESTful 路由。

使用效果

  • GET /posts/list-create/:返回所有文章列表(分頁由 GenericAPIViewpaginate_queryset 支持)。
  • POST /posts/list-create/:創建新文章,返回 201 狀態碼和創建的文章數據。
  • GET /posts/(ViewSet):列出文章。
  • POST /posts/(ViewSet):創建新文章。

運行方式

  1. 確保 Django 和 DRF 已安裝:
    pip install django djangorestframework
    
  2. 將代碼添加到 Django 項目中,配置好 models.pyserializers.pyviews.pyurls.py
  3. 運行遷移命令以創建數據庫表:
    python manage.py makemigrations
    python manage.py migrate
    
  4. 啟動 Django 服務:
    python manage.py runserver
    

擴展提示

  • 添加權限:在視圖中設置 permission_classes(如 IsAuthenticated)以限制訪問。
  • 分頁:通過 DEFAULT_PAGINATION_CLASS 設置全局分頁,或在視圖中自定義 pagination_class
  • 過濾:使用 filter_backendsdjango-filter 實現查詢集過濾。

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

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

相關文章

HTML+CSS+JS基礎

文章目錄(一)html1.常見標簽(1)注釋(2)標題 h1~h6(3)段落 p(4)換行與空格 br \ (5)格式化標簽 b i s u(6)…

Vue導出Html為Word中包含圖片在Microsoft Word顯示異常問題

問題背景 碰到一個問題:將包含圖片和SVG數學公式的HTML內容導出為Word文檔時,將圖片都轉為ase64格式導出,在WPS Word中顯示正常,但是在Microsoft Word中出現圖片示異常。具體問題表現 WPS兼容性:在WPS中顯示正常&#…

橢圓曲線密碼學 Elliptic Curve Cryptography

密碼學是研究在存在對抗行為的情況下還能安全通信的技術。即算法加密信息,再算法解密出信息。加密分為兩類 1. Symmetric-key Encryption (secret key encryption) 即一種密鑰,加密和解密使用同一密鑰,可相互轉換 2. Asymmetric-key Encry…

wedo牛-----第47節(免費分享圖紙)

夸克網盤:https://pan.quark.cn/s/4b40a8d18979 高清圖紙源文件,需要的請自取

Unity | AmplifyShaderEditor插件基礎(第十集:噪聲的種類+火焰制作-下)

目錄 一、👋🏻前言 二、圓火焰 三、制作梯度 梯度成品預覽 1.GradientSample節點 2.gradient的用法 3.time節點 四、添加顏色 Color節點 五、火焰搖擺 1.X方向的移動 2.Y方向的移動 3.Z方向的移動 4.把xyz組合起來 Panner節點 六、擺放和…

黑馬Node.js全套入門教程,nodejs新教程含es6模塊化+npm+express+webpack+promise等_ts對象筆記

1.1 什么是運行環境? 運行環境是指代碼正常運行所需的必要環境!!!!! V8引擎負責解析和執行JavaScript代碼。內置API是由運行環境提供的特殊接口,只能在所屬的運行環境中被調用 1.2 JavaScrip…

React 項目環境變量使用指南

在 React 項目中正確使用環境變量是管理不同環境配置的關鍵技術。以下是完整的解決方案: 1. 創建環境變量文件 React 項目支持以下環境變量文件(按優先級從高到低): .env.development.local (本地開發環境).env.development (開發…

Oracle 關于一些連接故障的總結

積累了幾次Oracle客戶端連接故障,做下總結。 文章目錄1、案例案例1:客戶端連接報錯ORA-12514案例2:客戶端連接報錯ORA-28547案例3:客戶端連接報錯:Got minus one from a read call案例4:客戶端連接報錯&…

V-USB USB設備模擬原理分析

V-USB USB設備模擬原理分析 通過分析V-USB項目的核心文件,詳細解釋這個項目是如何在AVR微控制器上模擬USB設備的: 1. 整體架構 V-USB是一個純軟件實現的USB低速設備驅動,主要由以下幾個核心文件組成: usbdrv.c : USB協議棧的C語言…

kafka3.6下載安裝(傳統架構/KRaft模式)+實例測試

知識補充: Kafka 和 ZooKeeper 的關系可以用 “協作依賴” 來概括。在 Kafka 的早期版本(Kafka 2.8.0 之前)中,ZooKeeper 是 Kafka 的核心依賴,用于管理集群元數據、協調 Broker 和 Controller 選舉等關鍵功能。但從 …

華控智能產品特點——產品生態全景與場景化創新

公司構建 “3X”產品戰略,以三大核心場景為基礎持續拓展技術外延: 1. 智能安防產品線軍工級指紋槍盒:采用6061-T6航空鋁材,內嵌震動報警模塊,非法開箱觸發90dB警鳴。為軍工企業定制的雙人認證版本需兩位授權人員同時驗…

爬蟲核心原理與入門技巧分析

一、爬蟲核心原理:模擬人類瀏覽的“自動化工具” 簡單來說,網絡爬蟲(Web Crawler)是一種按照一定規則,自動抓取互聯網信息的程序或腳本。其核心原理可以類比人類瀏覽網頁的過程,只不過將手動操作轉化為了代…

spring-cloud微服務部署-feign服務間調用

1 準備工作 需要安裝并啟動nacos&#xff0c;作為服務注冊中心。地址&#xff1a;https://nacos.io/ 2 項目結構 parent的pom.xml聲明依賴&#xff1a; <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</gr…

IDEA高效開發:Database Navigator插件安裝與核心使用指南

目錄 1.前言 2.正文 2.1安裝流程 2.1.1IDE內部安裝 2.1.2手動下載安裝 ?? 避坑指南 2.2使用教程 2.2.1連接數據庫 2.2.2查看數據庫/表 2.2.3查詢數據 2.2.4修改表結構 2.2.5生成代碼 2.2.6常見故障排除 3.小結 1.前言 “作為Java開發者&#xff0c;日常與數據…

Maven私服倉庫,發布jar到私服倉庫,依賴的版本號如何設置,規范是什么

Maven私服倉庫&#xff0c;發布jar到私服倉庫&#xff0c;依賴的版本號如何設置&#xff0c;規范是什么

量子卷積神經網絡:量子計算與深度學習的融合革命

引言&#xff1a;當卷積神經網絡遇上量子計算在人工智能與量子計算雙重浪潮的交匯處&#xff0c;量子卷積神經網絡&#xff08;Quantum Convolutional Neural Network, QCNN&#xff09;正成為突破經典算力瓶頸的關鍵技術。傳統卷積神經網絡&#xff08;CNN&#xff09;在圖像識…

線程(三) linux 同步

目錄 概念補充 條件變量 操作 例:多線程搶票 封裝 生產者消費者模型 生產者和消費者之間的關系 BlockQueue(阻塞隊列) 單生產單消費 信號量 簡介 操作 多生產者多消費者RingQueue(環形隊列)代碼 sem封裝 信號量與鎖 小知識 概念補充 同步:在保證數據安全的前…

Eclipse 生成 jar 包

Eclipse 生成 jar 包 引言 Eclipse 是一款功能強大的集成開發環境&#xff08;IDE&#xff09;&#xff0c;廣泛應用于 Java 開發領域。在 Java 開發過程中&#xff0c;將源代碼編譯成可執行的 jar 包是常見的需求。本文將詳細介紹在 Eclipse 中生成 jar 包的方法&#xff0c;包…

kafka--基礎知識點--0

kafka 架構 https://cloud.tencent.com/developer/article/2307892 19張圖 生產者架構 消息的磁盤存儲文件結構 https://cloud.tencent.com/developer/article/2307892 19張圖 produce消息分區策略 kafka–基礎知識點–5–生產者分區策略 ISR、OSR、AR 是什么&#xff1…

替換ngnix ssl 證書

1. 阿里云數字證書管理服務 -》SSL 證書管理 -》個人測試證書&#xff08;原免費證書&#xff09;-》查找相應域名的證書/新建證書&#xff0c;申請 -》下載證書&#xff0c;如果是ngnix服務器&#xff0c;就下載pem/key格式2.遠程連接服務器a.nginx -t :查看ngnix 配置文件在哪…