Django Rest Framework のテストでハマったこと (1)

Published: 2021-09-29 21:20 +0900 by Chirimen

Django Rest Framework のテストコードの例でよく出てくる reverse('user-list') というような記述。 ここに出てくる user-list の部分って、 何を書いたらいいの? って話。

はじめに

Django Rest Framework でのテストの書き方を調べていたところ、 URL を取得するのに reverse('user-list') というような記述例をよく見かけた。

user はモデルの名前だとして、その後の -list ってなんだろう?

手元で試すと user では動かなくて user-list だと動くのだけれども、 そもそも reverse() に何を指定すべきかよくわからないのだ。

django.urls.reverse のドキュメント

公式ドキュメント django.urls の reverse() を見ると、

If you need to use something similar to the url template tag in your code, Django provides the following function:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

とあって、引数には viewname を指定するらしい。 viewnamepath() で指定した名前、 urls.pyurlpatterns で指定したやつのようだけれども、 自分のコードだと次のようになっていて、 viewname を明示的に指定していない。

router = routers.DefaultRouter()
router.register(r'person', views.PersonViewSet)
()

urlpatterns = [
    path('addressbook/', include(router.urls)),
    path('admin/', admin.site.urls),
]

上のコードだと router.urls をインクルードしているので、 routers (rest_framework.routers) について調べる必要がありそうだ。

rest_framework.routers のドキュメント

Django REST framework の公式ドキュメント Routers を参照すると

The example above would generate the following URL patterns:

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'

とあって、 サフィックス -list, -detail が router によって登録されていたことがわかる。

DefaultRouter の場合の完全な表は次のようになっていて、 これで reverse() の引数に何を指定すればいいかがわかるようになった。

DefaultRouter

おわりに

上記のことが、 当初調べていてもさっぱり検索に引っかかってこなかった。 探し方が悪いのかもしれないし、 慣れたら当たり前のようになって気にならなくなるのかもしれないけれど、 割と行き詰まった感があったので、 初心を忘れないうちに書き留めておく。

Share

Latest Posts

Django Rest Framework のテストでハマったこと (4)

Django で既存データベースから inspectdb で作成した models.my は managed = False となっている。 そのままだと test を実行したときに、 テスト用データベースにモデルに対応したテーブルが作成されない。

Django Rest Framework のテストでハマったこと (3)

factory_boy の Faker() で、 取得した値を加工してから使用する話。

Django Rest Framework のテストでハマったこと (2)

Django のテスト用データを作成するのによく用いられる factory_boy で locale を指定して日本語圏用のデータを利用する話。