如何为Pydantic模型设置最小非空字段数量限制
解决方案
首先修正你的接口代码错误:FastAPI中直接将Pydantic模型作为参数类型即可,不需要dict=model的写法,正确的接口定义应该是def test(req: model):。
以下是Pydantic原生实现「至少提供一个有效字段」的两种方案,对应不同版本的Pydantic:
Pydantic v2 版本
使用model_validator(mode='after')在字段验证完成后检查是否有至少一个非空字段:
from pydantic import BaseModel, model_validator from typing import Optional class model(BaseModel): name: Optional[str] = None age: Optional[int] = None gender: Optional[str] = None @model_validator(mode='after') def check_at_least_one_field(self) -> 'model': # 遍历所有字段值,判断是否存在非None的有效字段 has_valid_field = any(value is not None for value in self.__dict__.values()) if not has_valid_field: raise ValueError("必须提供至少一个有效字段:name/age/gender") return self
Pydantic v1 版本
使用root_validator(skip_on_failure=True)实现相同逻辑:
from pydantic import BaseModel, root_validator from typing import Optional class model(BaseModel): name: Optional[str] = None age: Optional[int] = None gender: Optional[str] = None @root_validator(skip_on_failure=True) def check_at_least_one_field(cls, values): has_valid_field = any(value is not None for value in values.values()) if not has_valid_field: raise ValueError("必须提供至少一个有效字段:name/age/gender") return values
说明
- 给Optional字段设置
=None默认值,确保请求体中未包含的字段会被设为None,统一判断逻辑。 mode='after'(v2)和skip_on_failure=True(v1)的作用是:仅当所有字段自身的验证通过后,才触发「最少字段数」的检查,避免字段验证失败时重复报错。- 当请求体为空对象
{}时,Pydantic会自动抛出验证错误,无需在接口函数体内做额外判断。
内容的提问来源于stack exchange,提问作者Devil
相关产品推荐
相关产品推荐

