我正在尝试在 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
。
如此答案中所述,当字段声明为可选时,用户不需要在其HTTP请求中传递该字段的值。因此,用户可以将该字段保留在请求之外,在这种情况下,该字段将默认为
None
。
但是,在您的示例中,由于您在客户端的 HTTP 请求中将
input
字段的值指定为 "input": ""
。这意味着您为 str
字段传递一个空的 None
(与 input
不同),因此,将应用为该 Field()
指定的限制。反过来,这会导致您得到的错误,即
String should have at least 5 characters
,因为您在该 min_length=5
中指定了 Field()
。因此,如果您需要将某个字段的值保留为 None
,您所要做的就是避免在客户端的 HTTP 请求中为其发送值。