在djangorestframework==2.3.13
和djangorestframework==2.4.4
之间的某处,为 ModelViewSet 生成的 url conf 已更改为排除 '.' (句点/点)字符。 这意味着您的自定义 lookup_field 不能是域名或包含此字符的其他字符串。
给定一个视图集,例如:
class ZoneViewSet(viewsets.ModelViewSet):
lookup_field = 'domain__name'
生成以下网址( djangorestframework==2.3.13
):
^api/ ^v1/ ^zones/(?P<domain__name>[^/]+)/$ [name='zone-detail']
^api/ ^v1/ ^zones/(?P<domain__name>[^/]+)/\.(?P<format>[a-z0-9]+)$ [name='zone-detail']
现在使用djangorestframework==2.4.4
:
^api/ ^v1/ ^zones//$ [name='zone-detail']
^api/ ^v1/ ^zones/(?P<domain__name>[^/.]+)/\.(?P<format>[a-z0-9]+)$ [name='zone-detail']
[^]
指定排除集,因此[^/]
排除所有正斜杠,而[^/.]
排除正斜杠和句点(点)字符。
我认为没有理由限制 URI 中的句点,并且应该恢复此更改。
这是破坏了以前功能的提交https://github.com/tomchristie/django-rest-framework/commit/3cd15fb1713dfc49e1bf1fd48045ca3ae5654e18。 提交日志显示您已意识到该问题。 我想你不打算改变它,所以我会关闭这个问题。
发现这一点的任何人都知道,为了允许默认路由器生成的 urlconf 中的句点,您需要将lookup_value_regex = '[^/]+'
到您的视图集中。
我想知道为什么 dot 首先被排除在外...
Iirc 点会干扰在 url 中添加扩展内容类型的能力 - 即 /myendpoint.json
这是破坏先前功能3cd15fb的提交。 提交日志显示您已意识到该问题。 我想你不打算改变它,所以我会关闭这个问题。
发现这一点的任何人都知道,为了允许默认路由器生成的 urlconf 中的句点,您需要将
lookup_value_regex = '[^/]+'
到您的视图集中。
非常非常感谢你!
最有用的评论
这是破坏了以前功能的提交https://github.com/tomchristie/django-rest-framework/commit/3cd15fb1713dfc49e1bf1fd48045ca3ae5654e18。 提交日志显示您已意识到该问题。 我想你不打算改变它,所以我会关闭这个问题。
发现这一点的任何人都知道,为了允许默认路由器生成的 urlconf 中的句点,您需要将
lookup_value_regex = '[^/]+'
到您的视图集中。