自定义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
相关产品推荐
相关产品推荐

