当前位置: 首页 > 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.lryc.cn/news/592119.html

相关文章:

  • Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位
  • Mysql数据库——增删改查CRUD
  • Jfinal+SQLite解决MYSQL迁移表未复制索引问题,完善迁移工具
  • 算法学习笔记:29.拓扑排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • hadoop(服务器伪分布式搭建)
  • 瀚高数据库开启Oracle兼容模块
  • Oracle 11g RAC 高可用集群部署最佳实践
  • SQLite / LiteDB 单文件数据库为何“清空表后仍占几 GB”?——原理解析与空间回收实战
  • Golang 中 JSON 和 XML 解析与生成的完全指南
  • sqli-labs靶场通关笔记:第29-31关 HTTP参数污染
  • 配置本地git到gitlab并推送
  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • Visual Studio编译WPF项目生成的文件介绍
  • Newline全场景方案闪耀2025中国智慧生活大会
  • UniApp -- 小程序自定义导航栏组件
  • 共享模式、社群与开源链动2+1模式AI智能名片S2B2C商城小程序的协同发展研究
  • usb转can测试
  • 为Notepad++插上JSON格式化的翅膀
  • 全国计算机等级考试二级题库【C语言】:程序修改题型——结构体、可变数组、链表 自制答案详解合辑
  • 在 ASP.NET Core 和 JavaScript 中配置 WebSocket
  • 【计算机网络】MAC地址与IP地址:网络通信的双重身份标识
  • 依托CCLinkIE转ModbusTCP网关的转换达成西门子PLC连接配置案例
  • 计算机网络基础:从协议到通信全解析(大致框架)
  • Selenium自动化浏览器操作指南
  • websocket案例 599足球比分
  • IDEA高效开发:Database Navigator插件安装与核心使用指南
  • 【后端】.NET Core API框架搭建(10) --配置163邮件发送服务
  • 应用集成体系深度解析:从数据互通到流程协同
  • 实现库存显示和状态按钮的Question
  • nginx定制http头信息