django restframework View总结2

ViewSet.py

ViewSet.py的类结构如下:


django restframework View总结2_第1张图片
屏幕快照 2017-12-16 上午1.50.26.png

我们从GenericAPIView看起,

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):

GenericViewSet是在generics.GenericAPIView上添加了ViewSetMixin功能。
ViewSetMixin有重写了as_view()方法 。

class ViewSetMixin(object):
    view = MyViewSet.as_view({'get': 'list', 'post': 'create'})
    @classonlymethod
    def as_view(cls, actions=None, **initkwargs):

它除了重写as_view方法外,并没有绑定get,post方法对应的方法
因此使用的时候,也需要继承一个ListModelMixin。但是又有一些区别。
我们对比比较一下。

  1. 使用GenericAPIView配合ListModelMixin
class SnippetList(mixins.ListModelMixin,
                  generics.GenericAPIView):
    queryset = Snippet.objects.all()          ---------- GenericAPIView的属性
    serializer_class = SnippetSerializer   ----------- GenericAPIView的属性
    
     def get(self, request, *args, **kwargs):  ---------Django视图类都要重写这个(set/get)方法,
     return self.list(request, *args, **kwargs) -------- ListModelMixin的方法
  1. 使用GenericViewSet配合ListModelMixin
### view.py
class GoodsListViewSet(viewsets.GenericViewSet, mixins.ListModelMixin):
    """
    商品列表页
    """
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    pagination_class = StandardResultsSetPagination
### urls.py
利用ViewSetMixin重写的as_view()方法来完成get和list的绑定。
其中list方法是ListModelMixin提供的。

goods_list = GoodsListViewSet.as_view(
    {'get':'list',}
)
urlpatterns = [
    url(r'^goods/$', goods_list, name='goods-list')
]

使用router来简化配置代码

此步设置了get 和list的方法绑定,实际上这种默认绑定关系可以通过router来完成

goods_list = GoodsListViewSet.as_view(
    {'get':'list',}
)

如下使用

from  rest_framework.routers import DefaultRouter
1. 创建router
router = DefaultRouter()
2.  绑定哪个类来处理/goods请求
router.register(r'goods', GoodsListViewSet)
3. 使用router.urls来include它。
urlpatterns = [
      url(r'^', include(router.urls)),
]

你可能感兴趣的:(django restframework View总结2)