DRF 中的动作装饰器不适用于 url_path

问题描述 投票:0回答:2

我正在尝试实现这样的端点

/api/messages/<str:email>/
将返回给定电子邮件的消息列表。
所以在我的 ViewSet 中我创建了一个带有
@action
装饰器

的函数
@action(
    detail=False,
    methods=["get"],
    name="Get email messages",
    url_path="<str:email>",
    url_name="Email's messages"
)
def email_messages(self, request, email=None):
    return Response({"aaa": email}, status=200)

但 django 似乎无法解析,例如。此网址:

/api/messages/aaa/
(仅用于测试)并返回 404。

即使我将

url_path
更改为
email
,它也会在
/api/messages/email/
上返回 404。仅当我从参数中删除
url_path
kwarg 时,它才有效。然后可以在
/api/messages/email_messages
下访问它。

如何在

GET
上实现工作
/api/messages/<str:email/
以便将电子邮件传递给该函数?

django django-rest-framework
2个回答
20
投票

似乎 DRF 不接受 Django 路径表达式,但是,正则表达式。因此,您需要使用

url_path=r'(?P<email>\w+)'
而不是
url_path=<str:email>

此外,此路径将覆盖默认详细视图,即

/api/messages/<PK>/
API。因此,我建议在此电子邮件端点使用一些前缀

@action(
    detail=False,
    methods=["get"],
    name="Get email messages",
    url_path=r'some-prefix/(?P<email>\w+)',
    url_name="Email's messages"
)
def email_messages(self, request, email=None):
    return Response({"aaa": email}, status=200)

现在,您的 API 端点将是,

/api/messages/some-prefix/foo-bar/


0
投票

我遇到了这个问题,正则表达式不起作用,我不知道为什么在正则表达式中使用 url_path 时整个额外操作部分会消失,并且在操作中使用 Django 路径时不起作用,现在我添加了路径,就像也许有人一样可以解释一下,或者像我这样的人可以使用这个解决方案:

urlpatterns = [path( "getattributes/<slug:product_class_slug>/", ClassViewSet.as_view({"get": "get_class_attribute"}),), ] + router.urls

© www.soinside.com 2019 - 2024. All rights reserved.