Pydantic 验证器删除空白字符串?

Eso*_*ack 14 python pydantic fastapi

我有以下 Pydantic 模型:

class Report(BaseModel):
    id: int
    name: str
    grade: float = None
    proportion: float = None

    @validator('*', pre=True)
    def blank_strings(cls, v):
        print(v)
        if v == "":
            return None
        return v
Run Code Online (Sandbox Code Playgroud)

我的目标是能够将空字符串视为空值,但它似乎不起作用。

Report(id=5,name="Steve",grade=0.5) 创建一个实例,其中proportion=Nonebut... Report(id=5,name="Steve",grade=0.5,proportion="")抛出 error value is not a valid float (type=type_error.float)。我怎样才能得到与第一种情况相同的结果?

Fac*_*lla 21

派丹蒂克==1.9.0

最好的办法

from pydantic import BaseModel, Field

"""
The first argument of Field is 'default', refers to default value of attribute, 
if is '...' it means is 'required', if no value is assigned, it defaults to 'undefined' 
""" 

class Report(BaseModel):
    id: int = Field(..., gt=0)  # ... is required, and gt is 'greater than'
    name: str = Field(..., min_length=1)
    grade: float = Field(0.0, gt=0)
    proportion: float = Field(0.0, gt=0)

Run Code Online (Sandbox Code Playgroud)

另一种方式(我不推荐它,但你可能会在其他地方看到它。)

from decimal import Decimal
from pydantic import BaseModel, constr, condecimal, conint
        
class Report(BaseModel):
    id: conint(gt=0)
    name: constr(min_length=1)
    grade: condecimal(gt=Decimal(0.0)) = 0.0
    proportion: condecimal(gt=Decimal(0.0)) = 0.0
Run Code Online (Sandbox Code Playgroud)

检查:https://pydantic-docs.helpmanual.io/usage/types/#constrained-types

编辑:如果您使用 MyPy,或者您想使用相同的验证器,则必须创建一个继承自 ConstrainedStr、ConstrainedInt 等的类...

from decimal import Decimal
from pydantic import ConstrainedStr, ConstrainedInt, ConstrainedDecimal
        
class IdValidator(ConstrainedInt):
    gt=0

class NameValidator(ConstrainedStr):
    min_length=1

class DecimalValidator(ConstrainedDecimal):
    gt=Decimal(0.0)

class Report(BaseModel):
    id: IdValidator
    name: NameValidator
    grade: DecimalValidator = None
    proportion: DecimalValidator = None
Run Code Online (Sandbox Code Playgroud)

  • 为什么不推荐 `conint`、`constr` 等? (2认同)

Sea*_*ers 8

这对我来说适用于 pydantic==1.6.1:

class Report(BaseModel):
    id: int
    name: str
    grade: Optional[float]
    proportion: Optional[float]

    @validator('proportion', pre=True)
    def blank_string(value, field):
        if value == "":
            return None
        return value
Run Code Online (Sandbox Code Playgroud)

创建Optional相当于 的类型约束Union[float, None]

将空白字符串转换为 None 满足类型约束。