将额外参数传递给自定义操作

Ani*_*ozo 1 python django django-rest-framework

您好我有我的视图集中自定义操作,但除此之外细节= TRUE,林不知道如何将更多的参数添加到路由我想打从某个类别进行筛选医生的动作,URL应该是这样的doctor/categories/<int:category_id>,但即时得到尝试添加参数时找不到页面 (404)

  @action(detail=False, methods=['get'])
    def categories(self, request,*args, **kwargs):
        """ 
        Get a list of doctor profiles from an specific category 
        """


        data = {
            'profile' : 'doctor',
        }
        return Response(data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

编辑 -

当尝试这样的事情时

@action(detail=False, methods=['get'], url_path='categories/<int:category_id>')
    def categories(self, request,*args, **kwargs):
Run Code Online (Sandbox Code Playgroud)

我仍然收到错误 404 并且在检查可用路线时我发现了这个

v1/ ^profiles/doctors/categories/<int:category_id>/$ [name='profiles/doctors-categories']

v1/ ^profiles/doctors/categories/<int:category_id>\.(?P<format>[a-z0-9]+)/?$ [name='profiles/doctors-categories']

Run Code Online (Sandbox Code Playgroud)

所以网址就在那里......但也许我打错了?

这是我的网址

http://127.0.0.1:8000/v1/profiles/doctors/categories/1
Run Code Online (Sandbox Code Playgroud)

这是我的 urls.py(简化版)

from sanitas.views import doctor_schedule as doctor_schedule_views

router = DefaultRouter()

router.register(r'profiles/doctors', doctor_profiles_views.DoctorProfileViewset, basename='profiles/doctors')


urlpatterns = [ 
    path('', include(router.urls)),
]

Run Code Online (Sandbox Code Playgroud)

我希望你们能帮助我

JPG*_*JPG 7

来自Routing的 DRF doc for extra action

默认情况下,URL 模式基于方法名称,URL 名称是 ViewSet.basename 和带连字符的方法名称的组合。如果您不想为这些值中的任何一个使用默认值,您可以改为向装饰器提供url_pathurl_name参数@action

所以,url_path用作,

@action(detail=False, methods=['get'], url_path=r'categories/(?P<category_id>\d+)')
def categories(self, request, *args, **kwargs):
    return Response({'msg': 'ok', 'kwargs': kwargs})
Run Code Online (Sandbox Code Playgroud)

现在使用端点: /profiles/doctors/categories/1234/

注意:url_path值必须在正则表达式兼容字符串中,DRF 将无法识别它是否为路径兼容字符串


小智 7

您需要将 url_path 值更改为

url_path=r'categories/(?P<category_id>\d+)' 
Run Code Online (Sandbox Code Playgroud)

代替

url_path=r'categories/<category_id>)'
Run Code Online (Sandbox Code Playgroud)

category_id并且您的操作中需要 参数

@action(detail=False, methods=['get'], url_path=r'categories/(?P<category_id>\d+)')
def categories(self, request,category_id, *args, **kwargs):
#here you can access your category_id param
return Response(...)
Run Code Online (Sandbox Code Playgroud)