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视图和序列化类都设置查找字段。
- 用于执行各个model实例的对象查找的model字段。默认为
-
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】常用方法
-
- 返回列表视图中实用的查询集,该查询集还用作详细视图中的查找基础。
- 默认返回由
queryset
属性指定的查询集。 - 这个方法应该总是被调用而不是直接访问
self.queryset
,因为self.queryset
只会被计算一起,然后这些结果将为后续的请求缓存起来。 - 该方法可能会被重写以提供动态行为,比如返回基于发出请求的用户的结果集。
-
- 返回应用于详细视图的对象实例。
- 默认使用
lookup_field
参数过滤基本的查询集。 - 该方法可以被重写以提供更复杂的行为,例如基于多个 URL 参数的对象查找。
-
-
返回应用于序列化的类。默认为返回
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')
【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。 |