LoginSignup
43

More than 3 years have passed since last update.

django-rest-framework Routersを翻訳してみた。

Last updated at Posted at 2015-01-19

Usage

Routersの説明

urls.py
from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)
urlpatterns = router.urls

registerメソッドには、下記の2つの引数が必須となります。

prefix - URLのプレフィックス。
viewset - viewset classを指定。

オプションで、追加の引数も指定可能です。

base_name - ベースはURLに使用されます。

もし、base_name設定されていない場合、
veiwsetのmodel、またはqueryset属性を元に
自動的に生成されます。

モデルまたは、クエリセット属性がないveiwsetを登録する場合、
base_nameの設定が必要です。

上記の例として、以下のURLパターンとなります。

  • URL pattern: ^users/$ Name: 'user-list'
  • URL pattern: ^users/{pk}/$ Name: 'user-detail'
  • URL pattern: ^accounts/$ Name: 'account-list'
  • URL pattern: ^accounts/{pk}/$ Name: 'account-detail'

base_name引数は、ビュー名のパターンの最初の部分を指定するために使用される。
上記の例でいうと、usersまたはaccounts部分です。
通常は、 base_name引数を指定する必要はありませんが、
もし、viewsetget_querysetメソッドをカスタマイズしていた場合、
.queryset属性が設定されていないと下記のようなエラーが発生します。

'base_name' argument not specified, and could not automatically determine the name from the viewset, as it does not have a '.queryset' attribute.

routersの使い方

routerインスタンスの.urls属性は、URLパターンのリストが返却されます。
これについての使用方法は、複数あるので紹介していきます。

たとえば、既存のビューのリストにrouter.urlsを追加することができます。

urls.py
router = routers.SimpleRouter()
router.register(r'users', UserViewSet)
router.register(r'accounts', AccountViewSet)
urlpatterns = [
    url(r'^forgot-password/$', ForgotPasswordFormView.as_view()),
]
urlpatterns += router.urls

djangoの手法で下記のように書くこともできます。

urls.py
urlpatterns = [
    url(r'^forgot-password/$', ForgotPasswordFormView.as_view()),
    url(r'^', include(router.urls))
]

ルータのURLパターンの、ネームスペースを指定することができます。

urls.py
urlpatterns = [
    url(r'^forgot-password/$', ForgotPasswordFormView.as_view()),
    url(r'^api/', include(router.urls, namespace='api'))
]

エキストラリンクとアクション

viewsetのmethodに、@detail_route @list_routeのdecoraterを使用することで、ルーティングすることができます。

例)UserViewSetクラスのmethodを、decoraterで、ルーティングします。

views.py
from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import detail_route

class UserViewSet(ModelViewSet):
    ...

    @detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf])
    def set_password(self, request, pk=None):
        ...

以下のURLパターンは、さらに生成されることになります。

  • URL pattern: ^users/{pk}/set_password/$ Name: 'user-set-password'

作成したアクションに、自動で生成されるデフォルトのURLを使用したくない場合は、

url_pathパラメータを使用して、カスタマイズすることができます。

例) カスタムアクションへのURLを変更する場合は ^users/{pk}/change-password/$, 下記のように書くことができます。:

views.py
from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import detail_route

class UserViewSet(ModelViewSet):
    ...

    @detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf], url_path='change-password')
    def set_password(self, request, pk=None):
        ...

上記の例では、以下のURLパターンを生成しています。

  • URL pattern: ^users/{pk}/change-password/$ Name: 'user-change-password'

API Guide

SimpleRouter

routerには、 list, create, retrieve, update, partial_update , destroy アクションのルートが含まれています。
viewsetのmethodを、@detail_routeまたは@list_routeデコレータを使用して、ルーティングを追加することができます。

URL Style HTTP Method Action URL Name
{prefix}/ GET list {basename}-list
POST create
{prefix}/{methodname}/ GET, or as specified by `methods` argument `@list_route` decorated method {basename}-{methodname}
{prefix}/{lookup}/ GET retrieve {basename}-detail
PUT update
PATCH partial_update
DELETE destroy
{prefix}/{lookup}/{methodname}/ GET, or as specified by `methods` argument `@list_route` decorated method {basename}-{methodname}

デフォルトではSimpleRouterによって作成されたURLは、末尾にスラッシュが付加されます。
これは、ルータのインスタンスを作成するときに、trailing_slash引数をFalseに設定することで、解除することができます。

router = SimpleRouter(trailing_slash=False)

Djangoでは、末尾のスラッシュが使用されますが、
Railsや他のフレームワークなど、デフォルトで使用されていない場合もあります。

スラッシュの有無は、好みによりますが、JavaScriptのフレームワークで、仕様が決められている場合があるので、
注意してください。

The router will match lookup values containing any characters except slashes and period characters. For a more restrictive (or lenient) lookup pattern, set the lookup_value_regex attribute on the viewset.

例) 下記は、検索をUUIDに制限する場合です。

class MyModelViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    lookup_field = 'my_model_id'
    lookup_value_regex = '[0-9a-f]{32}'



[PR]
長方形-システム開発002.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43