提问人:Ahmad 提问时间:10/24/2023 最后编辑:ChrisAhmad 更新时间:10/24/2023 访问量:93
Pydantic 2.0 中的可选 str 具有字段约束
Optional str in Pydantic 2.0 with field constraints
问:
我正在尝试在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
答:
2赞
Chris
10/24/2023
#1
如本答案所述,当字段声明为可选字段时,用户不需要在其 HTTP 请求中传递该字段的值。因此,用户可以将该字段排除在请求之外,在这种情况下,默认为 .None
但是,在您的示例中,由于您在客户端的 HTTP 请求中将字段的值指定为 ,这意味着您为该字段传递一个空值(与 不同),因此,将应用为该 Field()
指定的限制。反过来,这会导致您得到的错误,即 ,因为您在 .因此,如果您需要将字段的值设置为 ,您所要做的就是避免在客户端的 HTTP 请求中发送该字段的值。input
"input": ""
str
None
input
"String should have at least 5 characters"
min_length=5
Field()
None
评论
null
None
bar: constr(min_length=5, max_length=200) = None
bar: Annotated[Optional[str], Field(min_length=5, max_length=200, default=None)]