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

自定义Pydantic字段以接受str或None类型值的实现问题

问题原因

这个错误是因为Pydantic在执行你的自定义校验逻辑前,会先做基础类型校验。你的EmptyStringField没有明确告知Pydantic它支持None类型,所以Pydantic直接拦截了None值并抛出类型错误。

解决方法

方法1:完善自定义字段类

给自定义字段添加__modify_schema__方法声明支持None,同时继承str让Pydantic更好识别类型:

from pydantic import BaseModel

class EmptyStringField(str):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        return "" if v is None else str(v)

    @classmethod
    def __modify_schema__(cls, field_schema):
        field_schema.update(type="string", nullable=True)

class Model(BaseModel):
    url: EmptyStringField

model = Model(url=None)
print(model.url)  # 输出: ""

方法2:使用内置校验器(更简洁)

无需自定义字段类,结合Union[str, None]和BeforeValidator实现需求:

from pydantic import BaseModel, BeforeValidator
from typing import Union

def none_to_empty(v):
    return "" if v is None else str(v)

class Model(BaseModel):
    url: Union[str, None] = BeforeValidator(none_to_empty)

model = Model(url=None)
print(model.url)  # 输出: ""

如果需要让字段默认值自动转为空字符串,可以加上always=True确保校验器处理默认值:

url: Union[str, None] = BeforeValidator(none_to_empty, always=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:13:22