【问题标题】:How to make Pydantic raise an exception right away如何让 Pydantic 立即引发异常
【发布时间】:2021-10-12 07:50:08
【问题描述】:

我编写了一个 Pydantic 模型来验证 API 负载。

payload有两个属性emailIdlistrolestr

{
    "emailId": [], 
    "role":"Administrator"
}

我需要对属性 email 进行两次验证 -

  1. emailId 不能为空。
  2. emailId 不得包含来自 x、y、z 域的电子邮件。

因此,我为 emailId 编写了 2 个验证方法,如下所示 -

class PayloadValidator(BaseModel):

    emailId: List[str]
    role: str

    @validator("emailId")
    def is_email_list_empty(cls, email):
        if not email_id:
            raise ValueError("Email list is empty.")
        return email_id

    @validator("emailId")
    def valid_domains(cls, emailId):
        pass

这里的问题是,如果emailId 列表为空,那么验证器不会立即raise ValueError。它等待所有验证方法完成执行,这给我带来了一些严重的问题。

有什么方法可以实现吗?

【问题讨论】:

  • 为此使用pre (def is_email_list_empty(cls, email, pre=True)) 首先进行列表验证
  • 它不能解决问题。它仍在执行valid_domain()。我希望它立即引发错误并终止进一步的验证。

标签: python pydantic


【解决方案1】:

如果你有检查,失败应该中断进一步的验证,然后把它们放在pre=Trueroot validator中。因为如果pre=True root 验证器引发错误,字段验证将不会发生

例如:

class PayloadValidator(BaseModel):

    emailId: List[str]
    role: str

    @root_validator(pre=True)
    def root_validate(cls, values):
        if not values['emailId']:
            raise ValueError("Email list is empty.")
        return values

    @validator("emailId")
    def valid_domains(cls, emailId):
        return emailId

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2017-01-19
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多