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
相关产品推荐
相关产品推荐

