【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.tpcf.cn/pingmian/89362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 配置文件在哪…