web-dev-qa-db-ja.com

Django RESTフレームワーク:ビューとビューセットの違いは?

関連 の場合があります。

viewsviewsetsの違いは何ですか?そして、routerurlpatternsはどうですか?

35
Edgar Derby

ViewSetsRoutersは、標準の動作と標準のURLを目指している場合、APIの実装を高速化するためのシンプルなツールです。

ViewSetを使用すると、オブジェクトのリストと1つのオブジェクトの詳細を取得するために個別のビューを作成する必要がありません。 ViewSetは、リストと詳細の両方で一貫した方法で処理します。

Routerを使用すると、ViewSetが「標準化された」状態に接続されます(グローバルな方法では標準ではなく、Django RESTフレームワークの作成者によって実装された構造です) URLの構造。そうすれば、手動でurlpatternsを作成する必要がなく、すべてのurlが一貫していることが保証されます(少なくともRouterが担当するレイヤー)。

それほど多くはないように見えますが、多数のurlpatternとビューを持つ巨大なAPIを実装する場合、ViewSetsRoutersを使用すると大きな違いが生じます。

説明をわかりやすくするために、これはビューセットとルーターを使用したコードです。

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"),
]
72
GwynBleidD