您的位置:首页 > 编程语言 > Go语言

django Rest Framework----GenericAPIView 通用视图 GenericAPIView源码分析

2018-06-20 22:10 591 查看

一、GenericAPIView

GenericAPIView扩展了APIView,为标准列表和详细视图添加了常见的行为。

提供的每个具体通用视图都是一个
GenericAPIView
或多个mixin类组合在一起而构建的。

例如:

BookView视图类继承自:

ListModelMixin:用于显示所有图书

CreateModelMixin:添加一本书

GenricAPIView:继承自APIView,提供as_view()等,获取当前视图类中queryset和serializer_class ,用于给ListModelMixin和CreateModelMixin使用。

class BookView(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):

queryset = models.Book.objects.all()
serializer_class = BookModelSerializer

def get(self,request, *args, **kwargs):
return self.list(request, *args, **kwargs)

def post(self,request,*args,**kwargs):
return self.create(request,*args,**kwargs)

.......


二、GenericAPIView做了哪些事

1.获取queryset数据,用于所有后续的操作

def get_queryset(self):
# 断言,满足我的条件参会向下执行,否则不执行
# 所以必须视图类必须提供一个queryset,例如BookView视图类中第一行
assert self.queryset is not None, (
"'%s' should either include a `queryset` attribute, "
"or override the `get_queryset()` method."
% self.__class__.__name__
)
# 获取当前类中的queryset
queryset = self.queryset
if isinstance(queryset, QuerySet):
queryset = queryset.all()
return queryset


2. 获取当前类
serializer_class
: 该用于验证和反序列化输入以及序列化输出的序列化程序类

def get_serializer_class(self):
#断言:必须满足条件才行
assert self.serializer_class is not None, (
"'%s' should either include a `serializer_class` attribute, "
"or override the `get_serializer_class()` method."
% self.__class__.__name__
)
#返回当前实例对象的serializer_class
return self.serializer_class


3.
lookup_field
:用于执行各个模型实例的对象查找的模型字段。默认是'pk'。

需要注意,使用超链接的API时,您需要确保双方的API意见和串行类设置查找字段

url(r'books/(?P<pk>\d+)/$',views.BookDetailView.as_view({'get': 'retrieve','put':'update','delete':'destroy'})),


4. 分页

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

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

5.过滤

filter_backends
- 应该用于过滤查询集的过滤后端类列表。默认值与
DEFAULT_FILTER_BACKENDS
设置相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: