Django REST框架:视图和视图集之间的区别?

时间:2015-09-15 14:47:55

标签: python django rest django-views django-rest-framework

可能是relevant

观看次数观看次数之间有什么区别?那么路由器 urlpatterns 呢?

1 个答案:

答案 0 :(得分:64)

如果您的目标是标准行为和标准网址,

ViewSetsRouters是加快API实施的简单工具。

使用ViewSet您不必创建单独的视图来获取对象列表和一个对象的详细信息。 ViewSet将以一致的方式为您处理列表和详细信息。

使用Router会将您的ViewSet与#34;标准化的" (它不是任何全局方式的标准,只是由Django REST框架的创建者实现的一些结构)URL结构。这样您就不必手动创建自己的网址,并确保所有网址都一致(至少在Router负责的图层上)。

看起来并不多,但是当实现一些巨大的api时,你会有很多很多网址和视图,使用ViewSetsRouters会产生很大的不同。

为了更好地解释:这是使用ViewSet和路由器的代码:

views.py:

from snippets.models import Article
from rest_framework import viewsets
from yourapp.serializers import ArticleSerializer

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

urls.py:

from django.conf.urls import url, include
from yourapp import views
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register(r'articles', views.ArticleViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]

使用普通视图并且没有路由器的等效结果:

views.py

from snippets.models import Article
from snippets.serializers import ArticleSerializer
from rest_framework import generics


class ArticleList(generics.ListCreateAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer


class ArticleDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

urls.py

from django.conf.urls import url, include
from yourapp import views

urlpatterns = [
    url(r'articles/^', views.ArticleList.as_view(), name="article-list"),
    url(r'articles/(?P<pk>[0-9]+)/^', views.ArticleDetail.as_view(), name="article-detail"),
]