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

FastAPI中Pydantic模型验证:能否在同一方法中对比多字段?

可行,但你当前的写法需要调整

你的需求完全可以实现,但目前的代码逻辑有问题,没法正确对比两个字段的值。下面给你两种靠谱的实现方式:

方式一:用field_validator结合ValidationInfo

通过ValidationInfo的data属性可以获取模型中已验证的其他字段值,同时需要给验证器加上mode="after",确保字段验证完成后再执行对比:

from pydantic import BaseModel, Field, field_validator, ValidationInfo

class QueryParams(BaseModel):
    origin: str = Field(...)
    destination: str = Field(...)

    @field_validator('origin', 'destination', mode="after")
    @classmethod
    def check_different_fields(cls, v: str, info: ValidationInfo) -> str:
        # 根据当前字段名获取另一个字段的值
        target_field = "destination" if info.field_name == "origin" else "origin"
        target_value = info.data.get(target_field)
        
        # 只有当另一个字段值存在且相同时,抛出错误
        if target_value is not None and v == target_value:
            raise ValueError(f"{info.field_name} 和 {target_field} 不能相同")
        return v

方式二:用model_validator(更推荐)

如果是跨字段的整体验证,用model_validator会更直观——它在所有字段验证完成后执行,直接对比模型属性即可:

from pydantic import BaseModel, Field, model_validator

class QueryParams(BaseModel):
    origin: str = Field(...)
    destination: str = Field(...)

    @model_validator(mode='after')
    def check_origin_different_from_destination(self) -> 'QueryParams':
        if self.origin == self.destination:
            raise ValueError("origin 和 destination 不能相同")
        return self

额外说明

  • 你的原代码中assert is_same逻辑错误,空字符串会触发断言,但实际应该判断两个字段值是否相等。
  • mode="after"是关键,确保验证器能拿到已验证的字段数据,避免因验证顺序导致的字段值缺失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:20:05