django restframework View总结2
2017-12-18 本文已影响0人
dc630f46ee2d
ViewSet.py
ViewSet.py的类结构如下:
屏幕快照 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。但是又有一些区别。
我们对比比较一下。
- 使用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的方法
- 使用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)),
]