最终我们一般都会使用 GenericViewSet 来完成我们的 视图,
各种视图的关系如下 (下面的继承上面的):
一、 View : django 自带的 视图方法 ,也可以返回 json 数据,但是用来做 restful aoi 功能
不够强大,编写完视图后需要在路由里面调用 as_view() 方法进行设置 。【可以直接继承】
二、 APIView :rest_framework 的view, 继承自 View ,可以做 restful aoi 功能,
但是需要自己重写 get 、post 等方法,编写完视图后也需要在路由里面调用
as_view() 方法进行设置 , 【可以直接继承】
三、GenericAPIView : rest_framework 的view ,继承自 APIView,没有 post、get 等方法,需要跟
mixins.ListModelMixin 同时继承才能使用 , 并且在最后需要定义 get 方法 来调用 ListModelMixin
的 list 方法实现 get 、post 等方法。
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
可以完成分页等功能,只需对 queryset(要展示的结果) 、 serializer_class(序列化器) 、 pagination_class(分页) 等
属性进行配置即可。 【需要跟 mixins.ListModelMixin 同时继承才能使用】
四、 ListAPIView : rest_framework 的view ,继承自 mixins.ListModelMixin 和 GenericAPIView ,
并且包含了 get 方法来调用 ListModelMixin 的 list 方法 , 算是对 GenericAPIView 的一个封装,
【可以直接继承】
class ListAPIView(mixins.ListModelMixin, GenericAPIView):
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
五、 GenericViewSet : rest_framework 的view ,继承自 ViewSetMixin 和 generics.GenericAPIView,
其中 ViewSetMixin 重写了 as_view 方法,
GenericViewSet 不能直接继承,要和 mixins.ListModelMixin 一起继承,ListModelMixin 主要是对
model 中得到的数据进行 分页,然后进行序列化,通过 Response 方法返回。
class ListModelMixin(object):
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
如果我们选择使用 GenericViewSet ,那么我们可以通过以下方式来配置路由 :
1.路由绑定,先调用 视图的 as_view 方法对 get 、 post 方法进行 绑定
snippet_list = SnippetListViewSet.as_view({
'get':'list',
'post':'create',
})
再把这个结果写到 django 的 url 里面
url(r'^SnippetList/$',snippet_list,name='SnippetList'),
2.路由注册
先导入 rest_framework.routers 获取一个实例化对象
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
再把这个实例化对象设置到 django 的url 中
url(r'^', include(router.urls)),
最后根据需要把图注册到路由里面
router.register(r'SnippetList', SnippetListViewSet)