版权声明:转载请标明出处 https://blog.csdn.net/gymaisyl/article/details/84455352
㈠:APIView
APIView : 是DRF中所有视图的基类,特点如下:
-
Resquest和Response和Django中的HttpRequest和HttpResponse不一样,是进行相关处理的;
-
任何APIException异常都会被捕获到,并且处理成合适的响应信息;
-
在dispatch()分发前,会对请求进行身份认证、权限检查、流量控制
- 关于身份认证、权限检查、流量控制,有以下几个属性可以配置:
authentication_classes 列表或元祖,身份认证类
permissoin_classes 列表或元祖,权限检查类
throttle_classes 列表或元祖,流量控制类
- 关于身份认证、权限检查、流量控制,有以下几个属性可以配置:
-
关于get(),post(),put()等请求方法,都是常规的,并没有进行封装;
㈡:GenericAPIView
GenericAPIView,继承自APIView, 可以搭配扩展类使用,特点如下:
-
定义类视图使用的序列化器和查询集(属性);
-
queryset 列表视图的查询集 (queryset = xxx)
-
serializer_class 视图使用的序列化器(serializer_class = sss)
-
-
分页和过滤的控制(属性);
- pagination_class 分页控制类
- filter_backends 过滤控制后端
-
配合get_obiect()使用的(属性);
- lookup_field 查询单一数据库对象时使用的条件字段,默认为’pk’
- lookup_url_kwarg 查询单一数据时URL中的参数关键字名称,默认与look_field相同
-
查询集的获取/更改:
- get_queryset(self) :默认返回queryset属性,可以重写成自己需要的查询集;
-
获取序列化器对象:
- get_serializer:默认返回的是系列化器对象;
- 注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用,也就是说在序列化器类中,可以通过self.context[‘request’],获取对应的请求对象
-
获取序列化器;
- get_serializer_class(self):获取需要使用的序列化器,根据需求可以重写获取不同的序列化器;
-
获取对应的模型类对象:
- get_object(self): 默认使用lookup_field参数来过滤queryset。
- 若详情访问的模型类对象不存在,会返回404。
该方法会默认使用APIView提供的check_object_permissions
方法检查当前对象是否有权限被访问。
㈢:扩展类
注意,这些扩展类只提供各种方法实现相关的数据 查询 更新 修改等方法操作,里面并没有对应的请求函数(get(), post(),…)
-
ListModelMixin
- 列表视图扩展类,提供list(request, args, **kwargs)方法快速实现列表视图(所有数据),返回200状态码。
该Mixin的list方法会对数据进行过滤和分页*,如果不需要分页,那么需要设置pagination_class=None
- 列表视图扩展类,提供list(request, args, **kwargs)方法快速实现列表视图(所有数据),返回200状态码。
-
CreateModelMixin
- 创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。
-
RetrieveModelMixin
- 详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。
如果存在,返回200, 否则返回404
- 详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。
-
UpdateModelMixin
- 更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。
同时也提供partial_update(request, *args, **kwargs)方法,可以实现局部更新
。 成功返回200,序列化器校验数据失败时,返回400错误。
- 更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。
-
DestroyModelMixin
- 删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。
成功返回204,不存在返回404。
- 删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。
㈣:扩展类 & GenericAPIView的子类
这些子类,是在拥有扩展类和GenericAPIView之外,还提供请求方法。
- CreateAPIView : 提供 post 方法
- ListAPIView: 提供 get 方法
- RetireveAPIView: 提供 get 方法
- DestoryAPIView :提供 delete 方法
- UpdateAPIView: 提供 put 和 patch 方法
- RetrieveUpdateAPIView: 提供 get、put、patch方法
- RetrieveUpdateDestoryAPIView: 提供 get、put、patch、delete方法