2015-09-15 17 views
14

relevantとなる場合があります。Django RESTフレームワーク:ビューとビューセットの違い?

の違いは?viewsetsの違いは何ですか?そして、ルーターについては、urlpatterns

+0

あなたは[ビューセットのチュートリアル](http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/)を読みました?これは、ビュー+ URLパターンからビューセット+ルーターに移動することを説明しています。あなたが理解していない具体的なことはありますか? – Alasdair

+1

こんにちは@Alasdair、はい、私はチュートリアルを読んで、それは非常によくどのようにビューセットとビューの違いは何かに多くの言葉を費やすように見えませんビューセットを使用して説明します。関連すると思われる唯一の段落は、「ViewSetクラスはViewクラスとほぼ同じですが、getやputなどのメソッドハンドラではなく、読み込みや更新などの操作を提供する点が異なります。しかし、このパラグラフでさえ特に明白ではないようです(例えば、読み込みと更新を好む理由は何ですか?)。 –

+0

'get'と' put'に対する 'read'と' update'の利点は、あなたがそれらを呼び出すために使われたHTTPメソッドからapiメソッドを切り離したことです。その後、ルータを使用してビューセットをURLにフックすると、コードが節約され、APIの整合性が向上します。 – Alasdair

答えて

37

ViewSetsRoutersは、標準的な動作と標準のURLを目指している場合は、APIの実装をスピードアップするための簡単なツールです。

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

Routerを使用すると、ViewSetを「標準化」(グローバルには標準ではなく、Django RESTフレームワークの作成者によって実装された一部の構造)のURL構造に接続します。そのようにすれば、手作業でURLパターンを作成する必要はなく、すべてのURLが一貫していることが保証されています(少なくともRouterが責任を負います)。

多くのようには見えませんが、多くのURLパターンとビューを持つような巨大なAPIを実装する場合、ViewSetsRoutersを使用すると大きな違いが生じます。より良い説明のために

:通常のビューを使用して

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 
from rest_framework import viewsets 
from yourapp.serializers import ArticleSerializer 

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

urls.pyこれは、コードビューセットとルータを使用していますルータ:

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"), 
] 
+0

申し訳ありませんが、私はそれを見ていません。 :(ルータ=ルータ.SimpleRouter(); router.register(r'accounts '、AccountViewSet) 'と' urlpatterns = [url(r'^accounts/'、AccountView)]の違いは何ですか?? –

+1

最初に1つは2つのURLを登録します(リスト用と詳細用)。更新された回答を参照 – GwynBleidD

+0

もっと明確になりました、ありがとうございました! –

関連する問題