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

时间:2020-07-25 15:05:29

标签: django django-rest-framework

我正在尝试使此类端点/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/正常工作,以便将电子邮件传递给该功能?

1 个答案:

答案 0 :(得分:1)

DRF似乎不接受 Django路径表达式 ,而是 regex表达式 。因此,您需要使用 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/