viewsets 和generics 都是对下层的APIView和mixin进行组合
mixin包含的类
CreateModelMixin #新建一个信息
ListModelMixin #一个列表信息
RetrieveModelMixin #单独一个信息
UpdateModelMixin #更新一个信息
DestroyModelMixin
首先是generices包含
GenericViewSet(viewsets) -drf
GenericAPIView -drf
APIView -drf
View -django
GenericAPIView(views.APIView) #对APIView进行封装
CreateAPIView(mixins.CreateModelMixin, #组合一个create
GenericAPIView)
ListAPIView(mixins.ListModelMixin,
GenericAPIView)
RetrieveAPIView(mixins.RetrieveModelMixin,
GenericAPIView)
DestroyAPIView(mixins.DestroyModelMixin,
GenericAPIView)
UpdateAPIView(mixins.UpdateModelMixin,
GenericAPIView)
ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView)
RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
GenericAPIView)
这样的组合 可以实现不同的功能 但是也有一个麻烦的地方
以 ListAPIView(mixins.ListModelMixin,GenericAPIView) 为例
class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
他需要写一个get 方法 与list进行绑定 所以有点麻烦
但是ViewSets就可以省略这一步
Viewsets中包含的方法
ViewSetMixin(object)
ViewSet(ViewSetMixin, views.APIView)
GenericViewSet(ViewSetMixin, generics.GenericAPIView)
ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
mixins.ListModelMixin,
GenericViewSet)
ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet)
ViewSets封装了两个类 ViewSetMixin(object) 和ViewSet(ViewSetMixin, views.APIView)
然后进行组合 就可以实现里面的方法 就不用在view中绑定HTTP和他们的关系了
而是在urls配置中进行绑定
有两种方法
第一就是
# 商品列表页
goods_list = GoodsListViewSet.as_view({
# 绑定关系 还可以更简单
'get': 'list',
})
urlpatterns = [
url(r'^goods/', goods_list,name='goods_list),
]
第二种就更简单了
from rest_framework.routers import DefaultRouter
from goods.views import GoodsListViewSet
router = DefaultRouter()
# 配置goods的url
router.register(r'goods', GoodsListViewSet)
#以后再注册进再写一个router就行了
同时viewsets 还提供了一些action给我们 更加方便
网友评论