web-dev-qa-db-ja.com

Django rest frameworkでViewSetカスタムアクションのURLを逆にする方法

ViewSetのカスタムアクションを定義しました

from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    @action(methods=['get'], detail=False, permission_classes=[permissions.AllowAny]) 
    def gender(self, request):
        ....

そして、ビューセットは従来の方法でURLに登録されます

from Django.conf.urls import url, include                                          

from rest_framework import routers                                                 
from api import views                                                              


router = routers.DefaultRouter()                                                   
router.register(r'users', views.UserViewSet, base_name='myuser')                   

urlpatterns = [                                                                    
    url(r'^', include(router.urls)),                                               
]   

URL /api/users/gender/は機能します。しかし、ユニットテストでreverseを使用して取得する方法がわかりません。 (確かにこのURLをハードコーディングできますが、コードから取得するのは良いことです)

Django documentation によると、次のコードが機能するはずです

reverse('admin:app_list', kwargs={'app_label': 'auth'})
# '/admin/auth/'

しかし、私は次のことを試しましたが、動作しません

reverse('myuser-list', kwargs={'app_label':'gender'})
# errors out
reverse('myuser-list', args=('gender',))
# '/api/users.gender'

Django-restframework documentation には、reverse_actionという関数があります。しかし、私の試みはうまくいきませんでした

from api.views import UserViewSet
a = UserViewSet()
a.reverse_action('gender') # error out
from Django.http import HttpRequest
req = HttpRequest()
req.method = 'GET'
a.reverse_action('gender', request=req)  # still error out

そのアクションのURLを逆にする適切な方法は何ですか?

12
nos

ビューセットのbasenameアクションに追加するだけでreverseを使用できます:

reverse('myuser-gender') 

ドキュメントの 関連部分 を参照してください。

8
neverwalkaloner