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)
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华