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

Edg*_*rby 40 python django rest django-views django-rest-framework

可能是相关的.

视图视图之间有什么区别?那路由器urlpatterns呢?

Gwy*_*idD 78

ViewSetsRouters简单的工具来加速实现你的API,如果你的目标,以规范的行为和标准的URL.

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

使用Router将连接ViewSet到"标准化"(它不是任何全局方式的标准,只是由Django REST框架的创建者实现的一些结构)URL结构.这样您就不必手动创建urlpatterns并且保证所有url都是一致的(至少在Router负责的层上).

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

为了更好地解释:这是使用ViewSets和Routers的代码:

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
Run Code Online (Sandbox Code Playgroud)

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)),
]
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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"),
]
Run Code Online (Sandbox Code Playgroud)

  • 第一个将注册2个URL,一个用于列表,一个用于详细信息,请参阅更新的答案 (5认同)
  • 对不起,但我仍然看不到它。:( 有什么区别:`router = routers.SimpleRouter(); router.register(r'accounts', AccountViewSet)` 和`urlpatterns = [url(r'^accounts/', AccountView),]`? (2认同)
  • 很好的例子,这对我帮助很大,即使我使用了基于类的视图,我也很难看出差异。这让它变得如此明显,我希望文档是这样的。快速提问:在您的第一个视图集示例中,您是否忘记导入“文章”? (2认同)