如果值最初在要解析的对象中丢失,并且 return 值基于另一个值,而不是对象的一部分,如何调用验证器?
How to call validator if values is initially missed in object to parse, and return value based on another value, which is not part of object?
我想解析最初与模型不对应的对象,这意味着它的字段与目标架构不匹配。所以我想根据原始对象的其他值来推断模型值。在下面的场景中,我想给 foo
字典 src
的第一个键的值,例如
class Model(BaseModel):
foo: int
@validator('foo', pre=True, always=True, check_fields=False)
def convert_foo(cls, v, values):
v = values['src']
assert isinstance(v, dict)
return [*v.keys()][0]
m = Model.parse_obj({'src': {1: 2}})
我得到了
pydantic.error_wrappers.ValidationError: 1 validation error for Model
foo
field required (type=value_error.missing)
如何处理?是使用根验证器的唯一选择吗?
在您提出的方案中不能使用@validator
。来自 the documentation:
values
: a dict containing the name-to-value mapping of any previously-validated fields
注意“先前验证的字段”。即使您为 foo
(foo: int = 0
) 分配了默认值以避免 field required (type=value_error.missing)
,您也无法访问 src
,因为它不是一个字段。
@root_validator(pre=True)
,正如您所建议的那样,应该可行,我相信这是通常的方法。
我想解析最初与模型不对应的对象,这意味着它的字段与目标架构不匹配。所以我想根据原始对象的其他值来推断模型值。在下面的场景中,我想给 foo
字典 src
的第一个键的值,例如
class Model(BaseModel):
foo: int
@validator('foo', pre=True, always=True, check_fields=False)
def convert_foo(cls, v, values):
v = values['src']
assert isinstance(v, dict)
return [*v.keys()][0]
m = Model.parse_obj({'src': {1: 2}})
我得到了
pydantic.error_wrappers.ValidationError: 1 validation error for Model
foo
field required (type=value_error.missing)
如何处理?是使用根验证器的唯一选择吗?
在您提出的方案中不能使用@validator
。来自 the documentation:
values
: a dict containing the name-to-value mapping of any previously-validated fields
注意“先前验证的字段”。即使您为 foo
(foo: int = 0
) 分配了默认值以避免 field required (type=value_error.missing)
,您也无法访问 src
,因为它不是一个字段。
@root_validator(pre=True)
,正如您所建议的那样,应该可行,我相信这是通常的方法。