You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF使用外键关联lookup_field的ViewSet路由detail接口404问题

问题根源

这是Django REST Framework的SimpleRouter生成详情路由时,默认的lookup参数正则匹配规则导致的问题:

  1. DRF的SimpleRouter生成详情路由时,默认会给lookup字段对应的路径参数应用[^/.]+的正则约束,要求该参数不能包含.和/字符。你需要匹配的域名(比如test.net)包含.字符,默认正则无法匹配,所以路由匹配失败返回404。
  2. 你手动编写path路由能正常工作,是因为Django原生path的默认str转换器匹配规则为「除/之外的所有字符」,允许.存在,所以可以正常匹配到域名参数。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:15:02