You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Pydantic Field设置字符串列表约束无效?如何解决?

解决Pydantic Field设置字符串列表元素约束无效的问题

你遇到的核心问题是Field参数的作用范围混淆:max_length是用来约束单个字符串字段的长度,不能直接给list[str]类型的字段加这个参数来约束列表内的元素。要同时实现「列表元素数量1-10」和「每个字符串元素最长10位」的约束,需要分别对列表本身和列表元素做配置。

正确实现方式(Pydantic v2推荐)

如果使用Pydantic v2,推荐结合Annotated给元素加长度约束,同时用Field控制列表的元素数量:

from pydantic import BaseModel, Field, Annotated

class FooListRequestModel2(BaseModel):
    # 先约束单个字符串元素的最大长度,再约束列表的元素数量范围
    name: list[Annotated[str, Field(max_length=10)]] = Field(..., min_items=1, max_items=10)
    age: int

兼容Pydantic v1的写法

如果仍在使用Pydantic v1,可以直接用constr作为列表的元素类型,配合Field控制列表长度:

from pydantic import BaseModel, Field, constr

class FooListRequestModel2(BaseModel):
    name: list[constr(max_length=10)] = Field(..., min_items=1, max_items=10)
    age: int

验证效果

现在运行测试代码,第二个实例会触发预期的验证错误:

if __name__ == "__main__":
    # 此处会抛出ValidationError:字符串元素长度超过10位的限制
    fooList2 = FooListRequestModel2(
        name=["01234567890123456789", "01234567890123456789"], age=20
    )
    print(fooList2)

原写法无效的原因

你之前的代码list[str] = Field(..., min_items=1, max_items=10, max_length=10)中,max_length参数是作用在整个name字段上的,但name是列表类型,Pydantic会直接忽略这个仅对字符串生效的参数,导致列表内的超长字符串完全没被校验。

内容的提问来源于stack exchange,提问作者Zack789

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:40:27