【问题标题】:Pydantic validator to remove blank strings?Pydantic验证器删除空白字符串?
【发布时间】:2020-04-22 08:18:52
【问题描述】:

我有以下 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)。我怎样才能得到与第一种情况相同的结果?

【问题讨论】:

  • 使用 pydantic==1.3 运行您的确切代码时,我没有收到错误消息。你运行的是哪个 pydantic 版本?
  • @Nicola 我使用的是 0.32.2,这是使用 fastapi 包的要求......我尝试了 1.3,它按你说的那样工作。 fastapi 上有一个未解决的问题来支持 Pydantic v1.0,但我不确定在此期间该怎么做。有人有任何解决方法建议让我的上述代码在 Pydantic 0.32.2 上运行吗?
  • Fastapi 自 0.44.0 版起支持 Pydantic v.1:fastapi.tiangolo.com/release-notes/#0440
  • @Nicola 确实如此,谢谢!解决了我的问题

标签: python fastapi pydantic


【解决方案1】:

这适用于 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 满足类型约束。

【讨论】:

    【解决方案2】:

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

    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-05
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2018-03-04
      相关资源
      最近更新 更多