如果值最初在要解析的对象中丢失,并且 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),正如您所建议的那样,应该可行,我相信这是通常的方法。