Pydantic 2.0 中的可选 str 具有字段约束

Optional str in Pydantic 2.0 with field constraints

提问人:Ahmad 提问时间:10/24/2023 最后编辑:ChrisAhmad 更新时间:10/24/2023 访问量:93

问:

我正在尝试在Pydantic 2.0中定义一个可选的字符串字段,该字段应遵循约束(如果提供),否则传递。但是,以下实现都不起作用,并且会给出相同的错误。None

    Option1: 
    role_desc: Annotated[
    str | None,
    Field(
        min_length=5,
        max_length=200,
        examples=["Role description is provided here"],
        default=None,
    ),
]
   Option 2:
   role_desc: Annotated[
    Optional[str],
    Field(
        min_length=5,
        max_length=200,
        examples=["Role description is provided here"],
        default=None,
    ),
]
 Option 3:
 role_desc: str | None =
    Field(
        min_length=5,
        max_length=200,
        examples=["Role description is provided here"],
        default=None,
    ),
]

上述所有实现都给出相同的错误。

{
  "detail": [
    {
      "type": "string_too_short",
      "loc": [
        "body",
        "role_desc"
      ],
      "msg": "String should have at least 5 characters",
      "input": "",
      "ctx": {
        "min_length": 5
      },
      "url": "https://errors.pydantic.dev/2.4/v/string_too_short"
    }
  ]
}

是否有任何可能的解决方案是让数据字段仅在提供某些字符串时进行验证,否则传递 .None

python fastapi pydantic 可选参数

评论

0赞 MatsLindh 10/24/2023
您的示例适用于 Pydantic v2.4 - 您的实际请求是什么样的?您是发送 /(或省略字段)还是空字符串?两者都按预期工作。nullNonebar: constr(min_length=5, max_length=200) = Nonebar: Annotated[Optional[str], Field(min_length=5, max_length=200, default=None)]
0赞 Ahmad 10/24/2023
我正在发送空字符串,正如您在验证错误消息中注意到的那样 “input”: “” 。如果我完全省略它,则会给我错误作为“无效的 Json”输入 {}
0赞 Chris 10/24/2023
请看一下这个答案

答:

2赞 Chris 10/24/2023 #1

本答案所述,当字段声明为可选字段时,用户不需要在其 HTTP 请求中传递该字段的值。因此,用户可以将该字段排除在请求之外,在这种情况下,默认为 .None

但是,在您的示例中,由于您在客户端的 HTTP 请求中将字段的值指定为 ,这意味着您为该字段传递一个空值(与 不同),因此,将应用为该 Field() 指定的限制。反过来,这会导致您得到的错误,即 ,因为您在 .因此,如果您需要将字段的值设置为 ,您所要做的就是避免在客户端的 HTTP 请求中发送该字段的值。input"input": ""strNoneinput"String should have at least 5 characters"min_length=5Field()None