7

我有以下 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

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

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

4

2 回答 2

3

这适用于 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

Optional创建类型约束等价Union[float, None]于.

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

于 2021-06-30T19:49:45.273 回答
0

您可以设置配置设置以忽略空白字符串。认为明确删除空字符串也是一种好习惯:

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

     class Config:
        # Will remove whitespace from string and byte fields
        anystr_strip_whitespace = True

    @validator('proportion', pre=True)
    def remove_blank_strings(cls, v):
        """Removes whitespace characters and return None if empty"""
        if isinstance(v, str):
            v = v.strip()
        if v == "":
            return None
        return v
于 2021-11-01T13:32:04.773 回答