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

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

相关文章:

  • (5)颜色的灰度,亮度,对比度,透明度,都啥意思
  • IDEA 2024.1 配置 MyBatis Generator 详细教程
  • PostgreSQL技术大讲堂 - 第97讲:PG数据库编码和区域(locale)答疑解惑
  • SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战
  • 基于单片机智能浇花控制系统设计
  • 短视频矩阵系统:选择与开发的全面指南
  • Instagram千号矩阵:亚矩阵云手机破解设备指纹检测的终极方案
  • Hadoop与云原生集成:弹性扩缩容与OSS存储分离架构深度解析
  • ThreadLocal 在 Spring 与数据库交互中的应用笔记
  • 车载监控录像系统:智能安全驾驶的守护者
  • SGLang 推理框架核心组件解析:请求、内存与缓存的协同工作
  • Android音视频探索之旅 | Webrtc 1对1音视频通话核心流程分析
  • Go语言实战案例-斐波那契数列生成器
  • 分表聚合助手类
  • UniApp TabBar 用户头像方案:绕过原生限制的实践
  • 依托CCLinkIE转ModbusTCP网关的转换达成西门子PLC连接配置案例
  • 涉及海量数据的查询SQL建议使用“数据库函数”封装并调用
  • Rust实战:高效对接Postman API
  • 【Nginx】nginx+lua+redis实现限流
  • 【Lua】闭包可能会导致的变量问题
  • 去中心化交易所(DEX)深度解析:解码行业头部项目
  • 双向广搜算法详解
  • 【现有资料整理】灵枢 - 用于医学领域的 SOTA 多模态大语言模型
  • 对Yii2中开启`authenticator`后出现的跨域问题-修复
  • .QOI: Lossless Image Compression in O(n) Time
  • 变量命名规则
  • git--gitlab
  • 性能远超Spring Cloud Gateway!Apache ShenYu如何重新定义API网关!
  • 无标记点动捕:如何突破传统娱乐边界,打造沉浸式交互体验
  • 高速公路自动化安全监测主要内容