DRF ReadOnlyModelViewSet多斜杠lookup_field兼容detail action问题咨询
DRF多斜杠lookup字段兼容detail action路由配置方案
直接在你的Test视图集中新增lookup_value_regex属性配置即可:
class Test(ReadOnlyModelViewSet): queryset = Test.objects.all() lookup_field = 'art' # 新增该行配置 lookup_value_regex = r'.*?(?=\/chars|$)' serializer_class = TestSerializer @action(methods=['GET'], detail=True) def chars(self, request, art): # 原有业务逻辑 ...
正则匹配逻辑说明
.*?采用非贪婪模式匹配任意字符,避免一次性吞噬所有后续路径段- 正向零宽断言
(?=\/chars|$)限制匹配终止位置:要么是/chars路径段的起始位置,要么是整个请求路径的末尾 - 既不会把
/chars后缀计入art字段的取值,也不会在无后缀的资源详情路径下出现匹配失败问题
路由无需做额外修改,保持原有SimpleRouter注册逻辑即可正常覆盖所有需求场景:
/api/test/first_product/test:匹配到路径末尾,art取值为first_product/test,命中资源详情接口/api/test/first_product/test/chars:匹配到/chars前的位置,art取值为first_product/test,剩余路径命中charsaction接口- 单级
art取值(如second_product)的两类路径也完全符合匹配规则
如果后续新增其他detail类型的action,只需要在正则的预查条件中新增对应路径段即可,例如新增info action后,正则修改为r'.*?(?=\/(chars|info)|$)'即可同时兼容所有detail action。
内容的提问来源于stack exchange,提问作者Антон Бондарь
相关产品推荐
相关产品推荐

