ViewSets并且
Routers如果您要针对标准行为和标准网址,则它们是加快API实现的简单工具。
使用
ViewSet您不必创建单独的视图即可获取对象列表和一个对象的详细信息。ViewSet将以一致的方式为您处理列表和详细信息。
使用
Router会将您连接
ViewSet到URL的“标准”结构(在任何全局方法上都不是标准的,只是Django
REST框架的创建者实现的某些结构)。这样,您就不必手动创建urlpattern,并且可以确保所有url都是一致的(至少在
Router负责该层的层上)。
看起来并不多,但是当实现一些巨大的api时,您将拥有很多urlpattern和视图,使用
ViewSets和
Routers会产生很大的不同。
为了更好的解释,这是使用ViewSets和Routers的代码:
views.py:
from snippets.models import Articlefrom rest_framework import viewsetsfrom yourapp.serializers import ArticleSerializerclass ArticleViewSet(viewsets.ModelViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer
urls.py:
from django.conf.urls import url, includefrom yourapp import viewsfrom rest_framework.routers import DefaultRouterrouter = DefaultRouter()router.register(r'articles', views.ArticleViewSet)urlpatterns = [ url(r'^', include(router.urls)),]
使用普通视图且没有路由器的等效结果:
views.py
from snippets.models import Articlefrom snippets.serializers import ArticleSerializerfrom rest_framework import genericsclass ArticleList(generics.ListCreateAPIView): queryset = Article.objects.all() serializer_class = ArticleSerializerclass ArticleDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Article.objects.all() serializer_class = ArticleSerializer
urls.py
from django.conf.urls import url, includefrom yourapp import viewsurlpatterns = [ url(r'articles/^', views.ArticleList.as_view(), name="article-list"), url(r'articles/(?P<pk>[0-9]+)/^', views.ArticleDetail.as_view(), name="article-detail"),]



