Viewsets:用于处理抽象概念,它允许开发人员专注对API的状态和交互进行建模,并根据通用约定自动处理URL构造
ViewSet类与View类几乎相同,除了提供诸如read或update,而不是诸如get或put的处理程序方法
重构使用ViewSets
from rest_framework import viewsets from .models import Goods from .serializers import GoodsSerializer class GoodsSetPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'page_size' page_query_param = 'p' max_page_size = 100 class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): queryset = Goods.objects.all() serializer_class = GoodsSerializer pagination_class = GoodsSetPagination
明确的将ViewSets绑定到url
当我们定义URL conf时,处理程序方法只会绑定到动作,为了看看到底发生了什么,首先从我们到ViewSets 中明确到创建一组视图
在该goods/urls.py文件中,将我们到ViewSet类绑定到一组具体到视图中
from goods.views import GoodsListViewSet goods_list = GoodsListViewSet.as_view({ 'get': 'list' }) urlpatterns = [ url(r"goods/$", goods_list, name="goods_list"), ]
使用routers
因为我们使用到是ViewSet类而不是View类,所以我们实际上不需要自己设计URL,将资源连接到视图和URL的约定可以使用Router类自动处理,
我们只需要用路由器注册适当的视图集,然后让其完成
from django.conf.urls import url, include from goods.views import GoodsListViewSet from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r'goods', GoodsListViewSet) urlpatterns = [ url(r'^', include(router.urls)), ]
路由器注册视图类似于urlpattern,我们包含两个参数-视图的url前缀和视图本身,
DefaultRouter我们使用的类也为我们自动创建了API根视图