GenericAPIView

GenericAPIView

此类扩展了REST框架的APIView类,为标准列表和详细信息视图添加了常用的行为。
提供的每个具体通用视图都是通过将GenericAPIView与一个或多个mixin类组合而构建的。

属性

**基本设置:**
以下属性控制基本视图行为。

- queryset - 应该用于从此视图返回对象的查询集.  通常,您必须设置此属性,或覆盖get_queryset()方法。如果要覆盖视图方法,则必须调用get_queryset()而不是直接访问此属性,因为queryset将被评估一次,并且将为所有后续请求缓存这些结果。
- serializer_class - 应该用于验证和反序列化输入以及序列化输出的序列化程序类。 通常,您必须设置此属性,或覆盖get_serializer_class()方法。
- lookup_field - 应该用于执行单个模型实例的对象查找的模型字段。 默认为'pk'。 请注意,使用超链接API时,如果需要使用自定义值,则需要确保API视图和序列化程序类都设置查找字段。
- lookup_url_kwarg - 应该用于对象查找的URL关键字参数。 URL conf应包含与此值对应的关键字参数。 如果未设置,则默认使用与lookup_field相同的值。

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

- pagination_clas - 分页列表结果时应使用的分页类。 默认为与DEFAULT_PAGINATION_CLASS设置相同的值,即'rest_framework.pagination.PageNumberPagination'。 设置pagination_class = None将禁用此视图上的分页。

**过滤:**

- filter_backends - 应该用于过滤查询集的过滤器后端类列表。默认值与DEFAULT_FILTER_BACKENDS设置的值相同。

类方法

[get_queryset(self)]

返回应该用于列表视图的查询集,该查询集应该用作详细视图中查找的基础。默认返回queryset属性指定的查询集。
应始终使用此方法而不是直接访问self.queryset,因为self.queryset仅被评估一次,并且这些结果将被缓存用于所有后续请求。

可以重写以提供动态行为,例如返回查询集,该查询集特定于发出请求的用户。

```
    def get_queryset(self):
        assert self.queryset is not None, (
        "'%s' should either include a `queryset` attribute, "
        "or override the `get_queryset()` method."
        % self.__class__.__name__
        )

        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            # Ensure queryset is re-evaluated on each request.
            queryset = queryset.all()
        return queryset

```

[get_object(self)]

返回应该用于详细视图的对象实例。 默认使用lookup_field参数来过滤基本查询集。

可以重写以提供更复杂的行为,例如基于多个URL kwarg的对象查找。

```
def get_object(self):
    queryset = self.filter_queryset(self.get_queryset())

        # Perform the lookup filtering.
        lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
        filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]}
        obj = get_object_or_404(queryset, **filter_kwargs)

        # May raise a permission denied
        self.check_object_permissions(self.request, obj)

        return obj
        
```

请注意,如果您的API不包含任何对象级别权限,您可以选择性地排除self.check_object_permissions,并简单地从get_object_or_404查找返回该对象。

[filter_queryset(self, queryset)]

给定一个查询集,使用正在使用的任何过滤后端过滤它,返回一个新的查询集。
例如:

```
def filter_queryset(self, queryset):
	filter_backends = (CategoryFilter,)

	if 'geo_route' in self.request.query_params:
		filter_backends = (GeoRouteFilter, CategoryFilter)
	elif 'geo_point' in self.request.query_params:
		filter_backends = (GeoPointFilter, CategoryFilter)

	for backend in list(filter_backends):
		queryset = backend().filter_queryset(self.request, queryset, view=self)

	return queryset
```

[get_serializer_class(self)]

返回应该用于序列化程序的类。 默认返回serializer_class属性。	可以重写以提供动态行为,例如使用不同的序列化程序进行读写操作,
    或者为不同类型的用户提供不同的序列化程序。

    def get_serializer_class(self):
        return self.serializer_class

子类处理增删改查

class ListAPIView(mixins.ListModelMixin,
              GenericAPIView):

class RetrieveAPIView(mixins.RetrieveModelMixin,
                  GenericAPIView):

class DestroyAPIView(mixins.DestroyModelMixin,
                 GenericAPIView):

class UpdateAPIView(mixins.UpdateModelMixin,
                GenericAPIView):

class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
                               mixins.UpdateModelMixin,
                               mixins.DestroyModelMixin,
                               GenericAPIView):
    
    #Concrete view for retrieving, updating or deleting a model instance.
    
    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def patch(self, request, *args, **kwargs):
        return self.partial_update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
原文地址:https://www.cnblogs.com/daviddd/p/11918959.html