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

如何在Pydantic 2中为列表字段的每个元素应用验证器?

Pydantic 1 到 2 迁移:处理列表元素的验证逻辑

你当前的@field_validator写法不会应用到imports的每个元素上——因为mode="before"是针对整个List字段做处理,而不是遍历其中的每个元素。

下面是两种正确的实现方式,对应你原来@validator(..., each_item=True)的逻辑:

方式一:使用@field_validator的each_item参数

Pydantic 2 中@field_validator保留了each_item参数,作用和 Pydantic 1 里的一致,配合mode="before"就能实现对列表每个元素的前置验证:

from pydantic import BaseModel, Field, field_validator
from typing import List

class ComplementQuery(BaseModel):
    imports: List[str] = Field(default_factory=list)
    subquery: str = Field(...)

    @field_validator("imports", mode="before", each_item=True)
    @classmethod
    def complement_imports(cls, value: str) -> str:
        return f'import "{value}"'

方式二:使用Annotated + BeforeValidator

你设想的这种写法是可行的,但需要修正Field的default_factory(应该传入可调用的list而非类型List),将验证器绑定到列表内的每个字符串元素上:

from pydantic import BaseModel, Field, BeforeValidator
from typing import List, Annotated

def complement_imports(v: str) -> str:
    return f'import "{v}"'

class ComplementQuery(BaseModel):
    imports: List[Annotated[str, BeforeValidator(complement_imports)]] = Field(default_factory=list)
    subquery: str = Field(...)

两种方式都能实现你需要的功能:

  • 如果验证逻辑仅针对该字段的元素,用Annotated的方式更直观,直接绑定到元素类型上;
  • 如果需要复用验证逻辑、或者依赖类的上下文,用@field_validator更灵活。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:24:59