一、基础类
1、APIView
DRF中的类视图最底层为APIView,APIView继承自Django的View视图,重新封装了request并初始化了一些组件。
主要实现功能有:
APIException——异常捕获
authentication_classes——用于身份认证
permission_classes——权限检查
throttle_classes—— 流量控制
使用中需要重写get(),post(),update()等方法
2、GenericAPIView
GenericAPIView(views.APIView)
继承自APIView,最主要新增功能:serializer_class 序列化器(可以将Django的serializers不能序列化的DataTime,Image等格式序列化);pagination_class 分页器;filter_backends 过滤器等
GenericAPIView一般需要Mixin组合使用。
二、五个拓展类Mixin
ListModelMixin 列表视图拓展类——get
RetrieveModelMixin 详情视图拓展类——get
CreateModelMxin 创建视图拓展类——post
UpdateModelMixin 更新视图拓展类——update
DestoryModelMixin 删除视图拓展类——delete
三、拓展类与GenericAPIView组合
常用的单功能类
ListAPIView (mixins.ListModelMixin,GenericAPIView)
RetrieveAPIView
CreateAPIVIew
UpdateAPIView
DestroyAPIView
也可以组合功能类,如ListCreateAPIView等
四、ViewSet
使用例子:
class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
"""
商品列表页
"""
queryset = Goods.objects.all()
serializer_class = GoodsSerializer
pagination_class = GoodsPagination
路由:
方法一:
router = DefaultRouter()
router.register(r'goods', GoodsListViewSet)
方法二:
# goods_list = GoodsListViewSet.as_view({
# 'get': 'list',
# })
可以看到我们将原本需要在函数中通过代码实现get与list的绑定,在viewset类视图中可以方便的在路由中绑定。
这是因为:
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
class ViewSetMixin(object):
"""
This is the magic.
Overrides `.as_view()` so that it takes an `actions` keyword that performs
the binding of HTTP methods to actions on the Resource.
For example, to create a concrete view binding the 'GET' and 'POST' methods
to the 'list' and 'create' actions...
view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
"""
ViewSetMixin中重写了as_view函数。
此外ViewSetMixin中对request初始化并添加了一些使用的action。
一般情况,viewset与router配合使用。
参考博客: