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

如何配置DRF ViewSet路由,让lookup_field支持含点号的特殊字符

解决DRF ViewSet含特殊字符(如'.')的lookup字段路由匹配问题

核心原因

DRF默认给lookup_field生成的路由正则是[^/.]+,会排除.和/,导致像TEATECH.01427964.11.08这类含点号的batch值无法匹配详情路由。

解决方案

直接在BatchViewSet中添加lookup_value_regex属性,覆盖默认的正则规则,允许匹配包含.的字符串:

class BatchViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.values('batch', 'customer', 'order_number').annotate(
        total_quantity=Sum('total_quantity'),
        ready_quantity=Sum('ready_quantity')
    ).filter(deleted_at__isnull=True).all()
    serializer_class = BatchSerializer

    lookup_field = 'batch'
    # 覆盖正则,只排除/,允许.等其他字符
    lookup_value_regex = r'[^/]+'

    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['batch', 'customer', 'order_number']

    ordering_fields = ['batch', 'customer', 'order_number',
                       'total_quantity', 'ready_quantity']
    ordering = ['batch']

    def create(self, request, *args, **kwargs):
        raise MethodNotAllowed('POST')

补充说明

  • 如果你之前尝试手动自定义路由失败,大概率是正则规则写错或和自动注册的路由冲突。用lookup_value_regex是DRF官方推荐的方式,简洁且不易出错。
  • 若遇到batch值以点号结尾时,带format参数的路由仍有问题,可禁用格式后缀:
    # 单个路由禁用
    router.register(r'batches', BatchViewSet, basename="batches").format_suffix_patterns = False
    
    或全局禁用:
    REST_FRAMEWORK = {
        'FORMAT_SUFFIX_KWARG': None,
    }
    
  • 你的queryset用了values()和annotate(),确认batch字段已包含在返回的字典中,当前代码里values('batch', ...)已经满足要求,无需调整。

内容的提问来源于stack exchange,提问作者Tea Tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:22:40