如何配置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 = FalseREST_FRAMEWORK = { 'FORMAT_SUFFIX_KWARG': None, } - 你的queryset用了
values()和annotate(),确认batch字段已包含在返回的字典中,当前代码里values('batch', ...)已经满足要求,无需调整。
内容的提问来源于stack exchange,提问作者Tea Tech
相关产品推荐
相关产品推荐

