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

如何在配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:15:04