如果在不使用验证器的情况下在字段中传递 None ,我可以在 pydantic 中设置默认值吗?

Fyz*_*zys 7 python-3.x pydantic

如果在不使用验证器的情况下在字段中传递 None ,我可以在 pydantic 中设置默认值吗?

我有以下代码,但在我看来,这里的验证器对于contract_ndfl来说是多余的。有没有什么办法可以不用验证器呢?

我的代码:

  class User(BaseModel):
        user: int
        s_name: str
        contract_ndfl: Optional[int]
        

       @validator('contract_ndfl')
       def set_contract_ndfl(cls, v):
           return v or 13
Run Code Online (Sandbox Code Playgroud)

如意代码:

class User(BaseModel):
      user: int
      s_name: str
      contract_ndfl: Optional[int] = 13
            
Run Code Online (Sandbox Code Playgroud)

ale*_* li 13

也许您可以对所有字段使用验证器并为其定义一个 BaseClass!

class NoneDefaultModel(BaseModel):

    @validator("*", pre=True)
    def not_none(cls, v, field):
        if all(
            (
                # Cater for the occasion where field.default in (0, False)
                getattr(field, "default", None) is not None,
                v is None,
            )
        ):
            return field.default
        else:
            return v
Run Code Online (Sandbox Code Playgroud)

然后你可以使用子类来实现你想要的代码:

class Bar(NoneDefaultModel):
    bar: int = 5

Bar(bar=None)
# Bar(bar=5)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,即使该字段是“可选”并且显式给出“无”,这也将应用默认值。验证器内部的检查还应该检查“field.allow_none”,并且仅在“False”时应用默认值。 (2认同)