DRF之视图组件

【四】视图组件

微信图片_20240422210120

图源:drf(详细)_51CTO博客_什么是drf

【1】两个视图基类

【1.1】APIView

  • 请在【View】中查看详细

【1.2】GenericAPIView

【1.2.1】常用类属性
  • 基本设置:

    • 以下属性控制着基本视图的行为。

    • queryset

      • 用于从视图返回对象的查询结果集。
      • 通常,你必须设置此属性或者重写 get_queryset() 方法。
      • 如果你重写了一个视图的方法,重要的是你应该调用 get_queryset() 方法而不是直接访问该属性,因为 queryset 将被计算一次,这些结果将为后续请求缓存起来。
    • serializer_class

      • 用于验证和反序列化输入以及用于序列化输出的Serializer类。
      • 通常,你必须设置此属性或者重写get_serializer_class() 方法。
    • lookup_field

      • 用于执行各个model实例的对象查找的model字段。默认为 'pk'
      • 请注意,在使用超链接API时,如果需要使用自定义的值,你需要确保在API视图序列化类设置查找字段。
    • lookup_url_kwarg

      • 应用于对象查找的URL关键字参数。它的 URL conf 应该包括一个与这个值相对应的关键字参数。
      • 如果取消设置,默认情况下使用与 lookup_field相同的值。
  • Pagination:

    • 以下属性用于在与列表视图一起使用时控制分页。

    • pagination_class

      • 当分页列出结果时应使用的分页类。
      • 默认值与 DEFAULT_PAGINATION_CLASS 设置的值相同,即 'rest_framework.pagination.PageNumberPagination'
  • Filtering:

    • filter_backends
      • 用于过滤查询集的过滤器后端类的列表。
      • 默认值与DEFAULT_FILTER_BACKENDS 设置的值相同。
【1.2.2】常用方法
  • get_queryset(self)

    • 返回列表视图中实用的查询集,该查询集还用作详细视图中的查找基础。
    • 默认返回由 queryset 属性指定的查询集。
    • 这个方法应该总是被调用而不是直接访问 self.queryset ,因为 self.queryset 只会被计算一起,然后这些结果将为后续的请求缓存起来。
    • 该方法可能会被重写以提供动态行为,比如返回基于发出请求的用户的结果集。
  • get_object(self)

    • 返回应用于详细视图的对象实例。
    • 默认使用 lookup_field 参数过滤基本的查询集。
    • 该方法可以被重写以提供更复杂的行为,例如基于多个 URL 参数的对象查找。
  • get_serializer_class(self)

    • 返回应用于序列化的类。默认为返回 serializer_class 属性的值。

    • 可以被重写以提供动态的行为,例如对于读取和写入操作使用不同的序列化器,或者为不同类型的用户提供不同的序列化器。

【1.2.3】其他方法
  • 你通常并不需要重写以下方法,虽然在你使用 GenericAPIView 编写自定义视图的时候可能会调用它们。
    • get_serializer_context(self)
      • 返回包含应该提供给序列化程序的任何额外上下文的字典。默认包含 'request', 'view''format' 这些keys。.
    • get_serializer(self, instance=None, data=None, many=False, partial=False)
      • 返回一个序列化器的实例。
    • get_paginated_response(self, data)
      • 返回分页样式的 Response 对象。
    • paginate_queryset(self, queryset)
      • 如果需要分页查询,返回页面对象,如果没有为此视图配置分页,则返回 None
    • filter_queryset(self, queryset)
      • 给定查询集,使用任何过滤器后端进行过滤,返回一个新的查询集。

【2】五个视图扩展类

  • Mixin 类提供用于提供基本视图行为的操作。
  • 注意mixin类提供动作方法,而不是直接定义处理程序方法,例如 .get().post(), 这允许更灵活的行为组成。
  • Mixin 类可以从 rest_framework.mixins导入。
视图扩展类 功能 方法
ListModelMixin 如果查询集被填充了数据,则返回 200 OK 响应,将查询集的序列化表示作为响应的主体。相应数据可以任意分页。 提供一个 .list(request, *args, **kwargs) 方法,实现列出结果集。
CreateModelMixin 如果创建了一个对象,这将返回一个 201 Created 响应,将该对象的序列化表示作为响应的主体。如果序列化的表示中包含名为 url的键,则响应的 Location 头将填充该值。
如果为创建对象提供的请求数据无效,将返回 400 Bad Request,其中错误详细信息作为响应的正文。
提供 .create(request, *args, **kwargs) 方法,实现创建和保存一个新的model实例
RetrieveModelMixin 如果可以检索对象,则返回 200 OK 响应,将该对象的序列化表示作为响应的主体。否则将返回 404 Not Found 提供一个 .retrieve(request, *args, **kwargs) 方法,实现返回响应中现有模型的实例。
UpdateModelMixin 如果一个对象被更新,这将返回一个 200 OK 响应,将对象的序列化表示作为响应的主体。
如果为更新对象提供的请求数据无效,将返回一个 400 Bad Request 响应,错误详细信息作为响应的正文。
提供 .update(request, *args, **kwargs) 方法,实现更新和保存现有模型实例。
同时还提供了一个 .partial_update(request, *args, **kwargs) 方法,这个方法和 update 方法类似,但更新的所有字段都是可选的。这允许支持 HTTP PATCH 请求。
DestroyModelMixin 如果删除对象,则返回 204 No Content 响应,否则返回 404 Not Found 提供一个 .destroy(request, *args, **kwargs) 方法,实现删除现有模型实例

【3】九个视图子类

  • Generic views - Django REST framework中文站点 (q1mi.github.io)
  • 这些视图子类遵循了通用的设计原则,封装了常见的 API 操作,使得开发人员能够以更高效、更简洁的方式编写 API 视图。
  • 同时,它们也提供了灵活性,允许开发人员通过继承和混合来自定义和扩展功能,以满足特定的业务需求。
  • 这些视图类可以从 rest_framework.generics导入
视图子类 功能 继承 方法
CreateAPIView 用于 仅创建 端点。 GenericAPIView
CreateModelMixin
post
ListAPIView 用于 只读 端点以表示模型实例集合 GenericAPIView
ListModelMixin
get
RetrieveAPIView 用于只读 端点以表示单个模型实例 GenericAPIView
RetrieveModelMixin
get
DestroyAPIView 用于只删除端点以表示单个模型实例 GenericAPIView,
DestroyModelMixin
delete
UpdateAPIView 用于只更新端点以表示单个模型实例 GenericAPIView
UpdateModelMixin
put / patch
ListCreateAPIView 用于读写端点以表示模型实例的集合 GenericAPIView
ListModelMixin
CreateModelMixin
get / post
RetrieveUpdateAPIView 用于 读取或更新 端点以表示 单个模型实例 GenericAPIView
RetrieveModelMixin
UpdateModelMixin
get / put /patch
RetrieveDestroyAPIView 用于 读取或删除 端点以表示 单个模型实例 GenericAPIView
RetrieveModelMixin
DestroyModelMixin
get / delete
RetrieveUpdateDestroyAPIView 用于 读写删除 端点以表示 单个模型实例 GenericAPIView,
RetrieveModelMixin,
UpdateModelMixin,
DestroyModelMixin
get /put /patch /delete

【4】视图集

  • DRF允许你将一组相关视图的逻辑组合在单个类(称为 ViewSet)中。
  • 在其他框架中,你也可以找到概念上类似于 'Resources' 或 'Controllers'的类似实现。
  • ViewSet 只是一种基于类的视图,它不提供任何方法处理程序(如 .get().post()),而是提供诸如 .list().create() 之类的操作。
  • ViewSet 的方法处理程序仅使用 .as_view() 方法绑定到完成视图的相应操作。
  • 通常不是在 urlconf 中的视图集中显示注册视图,而是要使用路由类注册视图集,该类会自动为你确定 urlconf。

【4.1】ViewSetMixin

  • 重写了 .as_view() 方法,使其接受一个 actions 关键字参数,用于将 HTTP 方法与资源的动作进行绑定
    • 【注】所有继承了ViewSetMixin的视图类,在路由中都需要传递actions参数
    • actions参数通常为字典形式视图类.as_view({'请求方式':'执行的方法名'})
      • 如:MyViewSet.as_view({'get': 'list', 'post': 'create'})
  • 使用时,注意继承ViewSetMixin时需要在最左侧class CommonView(ViewSetMixin,ListAPIView)
# 凡是继承了  ViewSetMixin 的视图类
# 路由写法都需要改变

######## urls.py ########
urlpatterns = [
    path('xxx/',xxx.as_view({'请求方法名':'对应的视图函数'}))
]
  • 详细原理请看【DRF源码分析】
【示例】
# urls.py

from .views import CommonView
from django.urls import path

urlpatterns = [
    path('no_router/', CommonView.as_view(actions={'get': 'xxx', 'post': 'abc'}))
]
# views.py
class CommonView(ViewSetMixin,APIView):

    def xxx(self, request):
        return Response('xxx')


    def abc(self, request):
        return Response('abc')

image-20240425154433955

【4.2】四种视图集

视图集 功能 继承 方法
ViewSet ViewSet 继承自 APIView。你可以使用任何标准属性,如 permission_classes, authentication_classes 以便控制视图集上的 API 策略。 ViewSetMixin,
views.APIView
ViewSet 类不提供任何操作的实现。为了使用 ViewSet 类,你将重写该类并显式地定义动作实现。
GenericViewSet GenericViewSet 类继承自 GenericAPIView,并提供了 get_object, get_queryset 方法和其他通用视图基本行为的默认配置,但默认情况不包括任何操作。 ViewSetMixin,
generics.GenericAPIView
为了使用 GenericViewSet 类,你需要覆盖该类并且要么混合所需的混合类,要么明确定义动作的实现。
ModelViewSet ModelViewSet 类继承自 GenericAPIView,并通过混合各种混合类的行为来实现各种动作 mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet
ModelViewSet 类提供的动作包括 .list().retrieve().create().update().partial_update() .destroy()
ReadOnlyModelViewSet ReadOnlyModelViewSet 类也继承自 GenericAPIView。
posted @ 2024-04-22 22:27  Lea4ning  阅读(13)  评论(0编辑  收藏  举报