【问题标题】:Do `validator` methods need to check required arguments are required?`validator` 方法是否需要检查所需的参数是否需要?
【发布时间】:2019-08-10 02:06:09
【问题描述】:

docs看来,这段代码似乎在password1的第二个validator-decorated方法中包含了一个额外的检查,在values中。

我的观察是否正确 - 因为password1 不包含默认值,它确实是必需的,所以应该在那里?

from pydantic import BaseModel, ValidationError, validator

class UserModel(BaseModel):
    name: str
    password1: str
    password2: str

    @validator('name')
    def name_must_contain_space(cls, v):
        if ' ' not in v:
            raise ValueError('must contain a space')
        return v.title()

    @validator('password2')
    def passwords_match(cls, v, values, **kwargs):
        if 'password1' in values and v != values['password1']:
            raise ValueError('passwords do not match')
        return v

好的,在我看到的文档中继续阅读:如果另一个字段的验证失败(或该字段丢失),它将不会包含在值中,因此如果值中的“password1”和...在这个示例。

我可以看一个例子来说明这意味着什么吗?这是否意味着我需要始终检查值是否存在,如果它们在我的验证中发挥作用,即使它们是必需的?

【问题讨论】:

  • 另外 - 不清楚为什么在方法中返回 v.title() 而不是 v ?退货的目的是什么?我猜只有在类级别直接访问该方法时才使用返回值 /shrug

标签: fastapi pydantic


【解决方案1】:

我可以看一个例子来说明这意味着什么吗?这是否意味着我需要始终检查值是否存在,如果它们在我的验证中发挥作用,即使它们是必需的?

是的,如果您使用前面的字段,则始终需要考虑它可能会从 values 中丢失。这是因为验证器总是会被调用,即使之前的字段有错误(包括缺少的必填字段)。

另外——不清楚为什么在方法中返回的是 v.title() 而不是 v?返回的目的是什么?

值已更改,因此 samuel 将变为 Samuel,这是为了证明验证器可以修改值以及引发错误。

【讨论】:

  • 太棒了。我喜欢那个约定。谢谢。
猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多