如何在配置min_length和max_length校验规则时,去除字符串内部的空白字符?
问题原因
DRF 自带的CharField的trim_whitespace参数仅支持移除字符串首尾的空白字符,不会处理字符串内部的空白,因此你当前的配置无法实现需求。
方案一:自定义字段(推荐,可复用性高)
继承CharField重写内部处理逻辑,在执行长度校验前先移除所有空白字符:
from rest_framework import serializers # 自定义支持移除内部空白的CharField class FullTrimCharField(serializers.CharField): def to_internal_value(self, data): raw_value = super().to_internal_value(data) if isinstance(raw_value, str): # 移除所有空白字符,包括中间、首尾的 raw_value = raw_value.replace(" ", "") return raw_value
使用时直接替换原来的CharField即可,长度校验配置不需要调整:
name = FullTrimCharField(min_length=18, max_length=18, allow_blank=True, allow_null=True, required=False)
方案二:使用序列化器字段校验方法
如果不需要复用逻辑,可以直接在当前序列化器内加校验方法处理:
注意:使用该方案时需要删除原字段上的
min_length、max_length配置,因为默认字段校验会在自定义校验方法前执行,校验的是未处理内部空白的原始字符串,会出现逻辑错误。
class YourSerializer(serializers.Serializer): # 移除原有的min_length、max_length配置 name = serializers.CharField(trim_whitespace=True, allow_blank=True, allow_null=True, required=False) def validate_name(self, value): if not isinstance(value, str): return value # 移除所有空白字符 processed_value = value.replace(" ", "") # 手动校验处理后的长度 if len(processed_value) != 18: raise serializers.ValidationError("该字段长度必须为18位") return processed_value
效果验证
两种方案都可以满足你的测试用例要求:
- 测试不合法字符串
test_string_that_should_be_invalid = "1111111111111111 1":移除空格后长度为17,触发长度校验不通过 - 测试合法字符串
test_string_valid = "111111111111111111":无空白字符,处理后长度为18,校验通过
内容的提问来源于stack exchange,提问作者12735961238
相关产品推荐
相关产品推荐

