ビューセットとルータ(ViewSets&Routers)
チュートリアル6-ビューセットとルーター(ViewSets&Routers)
本文はwjc 133翻訳から発表され、転載を歓迎します.英語のレベルは限られていて、参考だけです.DemoのGithubアドレス:https://github.com/wjc133/DRF-Tutorial
注:以下のViewSetsとRoutersは翻訳されず、原文の意味をより明確に残しているような気がします.
RESTフレームワークは処理
ViewSetsを使用して再構築
まず、再構成
ここでは
次に再構築
今回私たちが使っているのは
ビューセットをURL構成にバインドする
プロセッサメソッドはURLConfを定義した場合にのみ動作にバインドされます.
ここではhttpメソッドと必要な動作をバインドすることによって,
Routersの使用
私たちは使用しているので
ViewSetsをRoutersに登録するプロセスは、urlpatternを提供することと実質的に似ています.viewsのURL prefixとviewset自体の2つのパラメータを導入した.私たちが使っている
Views vs ViewSets
ビジュアルセットを使用するのは非常に効果的な動作です.これにより、すべてのAPIのURLスタイルが一致していることを確認し、必要なコード量を最小限に抑え、URL confの詳細ではなく、インタラクティブとビジネスロジックに専念することができます.しかし、これはすべてのシーンでビューセットを使用するのが良いという意味ではありません.クラスベースのビューを使用するか、関数ベースのビューを使用するかを議論するときにも、似たようなトレードオフがあります.ビューセットを使用してビューを自分で構築していない場合ほど明確です.最後の章では、API schemaを追加する方法を見て、クライアント・ライブラリまたはコマンド・ライン・ツールを使用してAPIとインタラクティブにしようとします.
本文はwjc 133翻訳から発表され、転載を歓迎します.英語のレベルは限られていて、参考だけです.DemoのGithubアドレス:https://github.com/wjc133/DRF-Tutorial
注:以下のViewSetsとRoutersは翻訳されず、原文の意味をより明確に残しているような気がします.
RESTフレームワークは処理
ViewSets
の抽象を含み,開発者に状態モデリングとAPIインタラクションに専念させ,URLの作成過程を汎用的な仕様に従ってフレームワークに残して自動的に完成させることを図っている.ViewSet
およびView
機能的にはそれほど差はないがViewSet
・方法プロセッサ.read()
および.update()
のような方法を提供している.1つget
メソッドプロセッサにバインドされるのは、インスタンス化されたビューのセットの最後の時点だけです.このような複雑なURL conf定義は、通常、1つのput
オブジェクトを用いて処理される.ViewSetsを使用して再構築
まず、再構成
ViewSet
とRouter
の2つのビューが1つのビューセットUserList
です.元の2つのビューを削除し、単一のクラスで置き換えることができます.from rest_framework import viewsets
class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
`list` `detail` 。
"""
queryset = User.objects.all()
serializer_class = UserSerializer
ここでは
UserDetail
を使用しているので、デフォルトでは読み取りに関する方法しか提供されません.以前のようにquerysetとserialzierを提供する必要があります.classですが、2つのクラスに同じ情報を提供する必要はありません.次に再構築
UserViewSet
・ReadOnlyModelViewSet
とSnippetList
です.それらの代わりに単一のクラスを使用することもできます.from rest_framework.decorators import detail_route
class SnippetViewSet(viewsets.ModelViewSet):
"""
list,create, retrieve, update & destroy ,
, highlight 。
"""
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
@detail_route(renderer_classes=[renderers.StaticHTMLRenderer])
def highlight(self, request, *args, **kwargs):
snippet = self.get_object()
return Response(snippet.highlighted)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
今回私たちが使っているのは
SnippetDetail
全面的な読み書き機能が必要だからです.注意、私たちはSnippetHighlight
装飾器を使ってカスタムの動作を定義しました.名前はModelViewSet
です.このデコレーションは、標準@detail_route
/highlight
/create
を適用しない任意のカスタムendpointを追加するために使用できます.使用update
カスタム動作、デフォルトはdelete
リクエストです.修正が必要な場合は、@detail_route
パラメータを指定できます.カスタム動作のURLsのデフォルトはメソッド名そのもので、変更したい場合は装飾器にurl_を記入できます.pathパラメータ.ビューセットをURL構成にバインドする
プロセッサメソッドはURLConfを定義した場合にのみ動作にバインドされます.
GET
ファイルでは、methods
をいくつかの具体的なビューにバインドします.from snippets.views import SnippetViewSet, UserViewSet, api_root
from rest_framework import renderers
snippet_list = SnippetViewSet.as_view({
'get': 'list',
'post': 'create'
})
snippet_detail = SnippetViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
})
snippet_highlight = SnippetViewSet.as_view({
'get': 'highlight'
}, renderer_classes=[renderers.StaticHTMLRenderer])
user_list = UserViewSet.as_view({
'get': 'list'
})
user_detail = UserViewSet.as_view({
'get': 'retrieve'
})
ここではhttpメソッドと必要な動作をバインドすることによって,
urls.py
から複数のビューを作成することに注意する.次に、リソースを特定のビューにバインドし、通常のようにURLs confにビューを登録できます.urlpatterns = format_suffix_patterns([
url(r'^$', api_root),
url(r'^snippets/$', snippet_list, name='snippet-list'),
url(r'^snippets/(?P[0-9]+)/$' , snippet_detail, name='snippet-detail'),
url(r'^snippets/(?P[0-9]+)/highlight/$' , snippet_highlight, name='snippet-highlight'),
url(r'^users/$', user_list, name='user-list'),
url(r'^users/(?P[0-9]+)/$' , user_detail, name='user-detail')
])
Routersの使用
私たちは使用しているので
ViewSet
代替ViewSet
、実際には自分でURLの配置を設計する必要はなくなりました.リソースとビュー、URLを結合することは自動的に完了できるプロセスであり、ViewSet
を使用するだけでよい.私たちがしなければならないのは、写真集をRouterに登録することだけです.View
ファイルを書き直しましょう.from django.conf.urls import url, include
from snippets import views
from rest_framework.routers import DefaultRouter
# Create a router and register our viewsets with it.
router = DefaultRouter()
router.register(r'snippets', views.SnippetViewSet)
router.register(r'users', views.UserViewSet)
# The API URLs are now determined automatically by the router.
# Additionally, we include the login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
ViewSetsをRoutersに登録するプロセスは、urlpatternを提供することと実質的に似ています.viewsのURL prefixとviewset自体の2つのパラメータを導入した.私たちが使っている
Router
自動的にAPI rootビューを作成してくれるので、削除できますurls.py
メソッドです.Views vs ViewSets
ビジュアルセットを使用するのは非常に効果的な動作です.これにより、すべてのAPIのURLスタイルが一致していることを確認し、必要なコード量を最小限に抑え、URL confの詳細ではなく、インタラクティブとビジネスロジックに専念することができます.しかし、これはすべてのシーンでビューセットを使用するのが良いという意味ではありません.クラスベースのビューを使用するか、関数ベースのビューを使用するかを議論するときにも、似たようなトレードオフがあります.ビューセットを使用してビューを自分で構築していない場合ほど明確です.最後の章では、API schemaを追加する方法を見て、クライアント・ライブラリまたはコマンド・ライン・ツールを使用してAPIとインタラクティブにしようとします.