Django rest framework API Guide的 Generic views 翻译

Generic views 通用视图
Django的一般观点…被开发为通用使用模式的一种快捷方式。他们在视图开发中发现了一些常见的习惯用语和模式,这样您就可以快速地编写通用的数据视图,而不必重复自己的观点。
— Django文档
基于类的视图的一个关键好处是它们允许您编写可重用行为的部分。REST框架通过提供一些预先构建的视图,提供了常用的模式,从而利用了这一点。
REST框架提供的通用视图允许您快速构建与数据库模型密切相关的API视图。
如果通用视图不适合API的需要,可以使用常规的APIView类,或者重用通用视图使用的mixin和基类来组成自己的可重用的通用视图集。

Examples
通常,在使用通用视图时,您将覆盖视图,并设置几个类属性。
Django rest framework API Guide的 Generic views 翻译

对于更复杂的情况,您可能还希望覆盖视图类中的各种方法。
例如。
Django rest framework API Guide的 Generic views 翻译
对于非常简单的情况,您可能希望使用.as_view()方法传递任何类属性。例如,您的URLconf可能包含以下条目:
Django rest framework API Guide的 Generic views 翻译

API Reference API参考
GenericAPIView 通用API视图
这个类扩展了REST框架的APIView类,为标准列表和细节视图添加了通常需要的行为。
提供的每个具体的通用视图都是通过GenericAPIView与一个或多个mixin类组合而构建的。
Attributes 属性
基本设置:
下面的属性控制基本的视图行为。
queryset
应该用于从该视图返回对象的queryset。通常,您必须设置这个属性,或者覆盖get_queryset()方法。如果您正在覆盖一个视图方法,重要的是您需要调用get_queryset()而不是直接访问这个属性,因为queryset将会得到一次评估,并且这些结果将被缓存到所有后续的请求中。
serializer_class
应该用于验证和反序列化输入和序列化输出的序列化器类。通常,您必须设置这个属性,或者覆盖get_serializer_class()方法。
lookup_field
应该用于对单个模型实例执行对象查找的模型字段。默认为“pk”。注意,在使用hyperlinked API时,如果需要使用自定义值,则需要确保API视图和serializer类都设置查找字段。
lookup_url_kwarg
应该用于对象查找的URL关键字参数。URL conf应该包含与该值对应的关键字参数。如果未设置该缺省值,将使用与lookup_field相同的值。
页码:
在使用列表视图时,使用以下属性来控制分页。
pagination_class
在分页展示结果时应该使用的分页类。“rest_framework.pagination.PageNumberPagination”的默认值与DEFAULT_PAGINATION_CLASS设置的值相同。设置pagination_class=None将禁用这个视图上的分页。
过滤:
filter_backends
应该用于过滤queryset的过滤后端类的列表。默认值与DEFAULT_FILTER_BACKENDS设置相同。

Methods 方法
Base methods:
get_queryset(self)
返回应该用于列表视图的queryset,并且应该用作查找细节视图的基础。默认返回由queryset属性指定的queryset。
这种方法应该经常使用,而不是直接访问self.queryset,如self.queryset只得到一次评估,而这些结果将被缓存到所有后续请求中。
可以被提供的动态行为所覆盖,例如特定于用户发出请求再返回的一个queryset。
例如:
Django rest framework API Guide的 Generic views 翻译

get_object(self)
返回一个应该用于细节视图的对象实例。默认使用lookup_field参数来过滤基本的queryset。
例如基于多个URL kwarg的对象查找,提供更复杂的行为可能会被覆盖。
例如:
Django rest framework API Guide的 Generic views 翻译
请注意,如果您的API不包含任何对象级别的权限,那么您可以选择将self.check_object_permissions排除在外,并简单地从get_object_or_404查找中返回该对象。
filter_queryset(self, queryset)
给定一个queryset,用任何一个过滤器中过滤它,返回一个新的queryset。
例如:
Django rest framework API Guide的 Generic views 翻译
get_serializer_class(self)
返回应该用于序列化器的类。默认返回serializer_class属性。
用提供动态行为可能会被覆盖,例如使用不同的序列化器来读取和写入操作,或者为不同类型的用户提供不同的序列化器。
例如:
Django rest framework API Guide的 Generic views 翻译
保存和删除钩子:
下面的方法是由mixin类提供的,并且可以轻松地覆盖对象的保存或删除行为。
perform_create(self, serializer)
在保存新对象实例时调用CreateModelMixin。
perform_update(self, serializer)
在保存现有对象实例时调用UpdateModelMixin。
perform_destroy(self, instance)
在删除对象实例时,调用了DestroyModelMixin。
这些钩子对于设置请求中隐式的属性特别有用,但不是请求数据的一部分。打个比方,您可以基于请求用户或基于URL关键字参数设置该对象的属性。
Django rest framework API Guide的 Generic views 翻译
这些覆盖点对于添加在保存对象之前或之后发生的行为特别有用,比如发送确认信息,或者记录更新。
Django rest framework API Guide的 Generic views 翻译
您还可以通过抛出ValidationError()来使用这些钩子来提供额外的验证。如果需要在数据库保存点应用一些验证逻辑,那么这一点很有用。例如:
Django rest framework API Guide的 Generic views 翻译
注意:这些方法取代了旧式的版本2.x pre_save、post_save、pre_delete和post_delete方法,这些方法已不再可用。
其它方法:
您通常不需要覆盖以下方法,但是如果您使用GenericAPIView编写自定义视图,您可能需要调用它们。
get_serializer_context(self)
返回包含应该向序列化器提供的任何额外上下文的字典。默认包括“request”、“view”和“format”键。
get_serializer(self, instance=None, data=None, many=False, partial=False)
返回一个序列化器实例。
get_paginated_response(self, data)
返回一个分页样式的Response对象。
paginate_queryset(self, queryset)
如果需要的话,可以对一个queryset进行分页,或者返回一个页面对象,或者如果没有为这个视图配置分页,那么就返回None。
filter_queryset(self, queryset)
给定一个queryset,用任何一个过滤器去过滤它,返回一个新的queryset。
Mixins 混合
mixin类提供了用于提供基本视图行为的操作。请注意,mixin类提供了操作方法,而不是定义处理程序方法,例如.get()和.post()。这就允许了更灵活的行为组合。
mixin类可以从restframework.mixin中导入。
ListModelMixin
提供了一个.list(request, *args, **kwargs)方法,它实现了清单的一个queryset。
如果queryset被填充,则返回一个200 OK响应,并将queryset的序列化表示作为响应的主体。响应数据可以选择性地进行分页。
CreateModelMixin
提供了一个.create(request, *args, *kwargs)方法,实现创建和保存一个新的模型实例。
如果已经创建了一个对象,则返回一个201 Created的响应,将对象的序列化表示作为响应的主体。如果该表示包含一个名为url的键,那么响应的Location标头将使用该值填充。
如果为创建对象提供的请求数据无效,将返回一个400 Bad Request,错误细节将作为响应的主体。
RetrieveModelMixin
提供了一个.retrieve(request, *args, **kwargs)方法,它实现在响应中返回一个已存在的模型实例。
如果可以检索一个对象,则返回一个200 OK响应,将对象的序列化表示作为响应的主体。否则,它将返回404 Not Found。
UpdateModelMixin
提供了一个.update(request, *args, **kwargs)方法,实现更新和保存现有的模型实例。
还提供了一个.partial_update(request, *args, **kwargs)方法,它与更新方法类似,只是更新的所有字段都是可选的。这支持对HTTP补丁请求的支持。
如果一个对象被更新,它将返回一个200 OK响应,将对象的序列化表示作为响应的主体。
如果为更新对象而提供的请求数据无效,将返回400 Bad Request响应,并将错误详细信息作为响应的主体。
DestroyModelMixin
提供了一个.destroy(request, *args, **kwargs)方法,实现对现有模型实例的删除。
如果一个对象被删除,它将返回一个204 No Content响应,否则它将返回一个404 Not Found。
Concrete View Classes 具体视图类
下面的类是具体的通用视图。如果你使用的是通用视图,这通常是你要处理的级别,除非你需要大量的自定义行为。
视图类可以从rest_framework.generics中导入。
CreateAPIView
只用于创建端点。
提供一个post方法处理程序。
继承了: GenericAPIView, CreateModelMixin
RetrieveAPIView
用于只读单个模型实例的端点。
提供一个get方法处理程序。
继承了: GenericAPIView, RetrieveModelMixin
DestroyAPIView
用于删除单个模型实例的端点。
提供一个delete方法处理程序。
继承了:GenericAPIView DestroyModelMixin
UpdateAPIView
用于单个模型实例的更新的端点。
提供put和patch方法处理程序。
继承了:GenericAPIView UpdateModelMixin
ListCreateAPIView
用于读写端点来表示模型实例的集合。
提供get和post方法处理程序。
继承了:GenericAPIView ListModelMixin CreateModelMixin
RetrieveUpdateAPIView
用于读取或更新端点,以表示单个模型实例。
提供get、put和patch方法处理程序。
继承了:GenericAPIView RetrieveModelMixin UpdateModelMixin
RetrieveDestroyAPIView
用于读取或删除端点来表示单个模型实例。
提供get和delete方法处理程序。
继承了:GenericAPIView RetrieveModelMixin DestroyModelMixin
RetrieveUpdateDestroyAPIView
用于读写删除端点表示单个模型实例。
提供get、put、patch和delete方法处理程序。
扩展:GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin

Customizing the generic views定制通用视图
通常,您需要使用现有的通用视图,但是使用一些稍微定制的行为。如果您发现自己在多个地方重用了一些定制的行为,那么您可能希望将该行为重构为一个公共类,您可以根据需要将其应用到任何视图或视图集。
Creating custom mixins
例如,如果您需要基于URL conf中的多个字段来查找对象,您可以创建一个mixin类,如下:
Django rest framework API Guide的 Generic views 翻译
然后,您可以在需要应用自定义行为的时候简单地将这个mixin应用到视图或viewset中。
Django rest framework API Guide的 Generic views 翻译
如果您有需要使用的自定义行为,那么使用自定义的mixin是一个不错的选择。
Creating custom base classes
如果您在多个视图中使用mixin,您可以更进一步,创建您自己的基本视图集,然后在整个项目中使用它。例如:
Django rest framework API Guide的 Generic views 翻译
如果您有自定义行为,并且在整个项目中始终需要跨多个视图重复,那么使用自定义基类是一个很好的选择。

PUT as create
在版本3.0之前,REST框架mixin将PUT作为一个更新或一个创建操作,这取决于对象是否已经存在。
允许将PUT作为创建操作是有问题的,因为它必须公开关于对象的存在或不存在的信息。同样不明显的是,透明地允许重新创建以前删除的实例,这必然是一种更好的默认行为,而不是简单地返回404响应。
两种风格的“PUT as 404”和“PUT as create”在不同的情况下都是有效的,但是从3.0版本开始,我们现在使用404行为作为默认,因为它更简单,也更明显。
如果您需要通用的“PUT-as-create”行为,您可能需要将AllowPUTAsCreateMixin类包含到您的视图中。

Third party packages 第三方包
下面的第三方包提供了额外的通用视图实现。
Django REST Framework bulk
django-rest-framework-bulk包 实现了通用的视图混合,以及一些通用的具体的通用视图,允许通过API请求应用批量操作。
Django Rest Multiple Models
Django Rest Multiple Models 提供了一个通用视图(和mixin),用于通过一个API请求发送多个序列化的模型和/或queryset。