DRF使用外键关联lookup_field的ViewSet路由detail接口404问题
问题根源
这是Django REST Framework的SimpleRouter生成详情路由时,默认的lookup参数正则匹配规则导致的问题:
- DRF的SimpleRouter生成详情路由时,默认会给lookup字段对应的路径参数应用
[^/.]+的正则约束,要求该参数不能包含.和/字符。你需要匹配的域名(比如test.net)包含.字符,默认正则无法匹配,所以路由匹配失败返回404。 - 你手动编写path路由能正常工作,是因为Django原生path的默认str转换器匹配规则为「除
/之外的所有字符」,允许.存在,所以可以正常匹配到域名参数。 show_urls只能展示路由的参数名称,不会展示隐藏的正则约束,所以你看起来路由配置是正确的,实际因为正则不匹配无法正常访问。
解决方法
在你的TokenDomainPolicyViewSet里新增lookup_value_regex属性,修改正则匹配规则适配域名格式即可,不需要额外手动添加路由:
class TokenDomainPolicyViewSet(viewsets.ModelViewSet): lookup_field = 'domain__name' # 新增这一行,正则可根据你的域名实际规则调整 lookup_value_regex = r'[\w\-\.]+' serializer_class = serializers.TokenDomainPolicySerializer def get_queryset(self): return models.TokenDomainPolicy.objects.filter(token_id=self.kwargs['id'], token__user=self.request.user)
内容的提问来源于stack exchange,提问作者Peter Thomassen
相关产品推荐
相关产品推荐

