Pydantic报duplicate validator错误 无法同时使用Field别名和validator如何解决
问题解答
报错原因
你遇到的重复验证器错误和Field的使用本身无关,核心冲突点如下:
- 验证器方法名与字段名完全重名:你定义了名为
abc的字段,又将验证该字段的方法也命名为abc,二者在模型类的命名空间中冲突,Pydantic会将同名方法识别为重复注册的验证器,抛出该错误。 - 你的验证器写法还存在两处可优化的问题:
- 被
@validator装饰的方法第一个参数必须是类对象cls,不能直接传入value - 你将字符串类型的
value转为float存入了临时变量,但判断逻辑仍用原字符串做数值比较,会触发类型错误;同时else分支没有写return语句,会默认返回None,不符合你的预期逻辑。
- 被
不用Field设置别名的实现方案
如果不使用Field的alias参数,你可以通过模型的内部Config类的fields配置项来为字段指定别名,配置规则为fields = {"实际字段名": "目标别名"}。
修正后的完整代码
from pydantic import BaseModel, validator import datetime class MultiSourceInput(BaseModel): abc : str xyz : int # 验证器方法名不要和字段重名即可 @validator("abc") def validate_abc(cls, value): num_value = float(value) if 0 <= num_value <= 141: return value else: return "0" # 数值范围校验也可以不用Field,单独写validator实现 @validator("xyz") def validate_xyz(cls, value): if 0 <= value <= 150: return value raise ValueError("xyz取值范围为0-150") class Config: # 为字段指定别名 fields = { "abc": "abc_1", "xyz": "xyz_1" # 如果xyz也需要别名可以在这里加 } # 开启后支持同时用字段名和别名传参 allow_population_by_field_name = True # 补充字段描述,对应Field的description参数 schema_extra = { "description": { "abc": "xxxxxxxxxxxx.", "xyz": "xxxxxxxx " } }
内容的提问来源于stack exchange,提问作者slashie
相关产品推荐
相关产品推荐

