FastAPI如何将Student模型的age校验规则复用到StudentUpdateIn中
解决方案
你可以通过Pydantic模型继承或抽离公共校验规则的方式实现校验逻辑复用,不需要重复编写自定义validator。
方案1:抽象公共基类(推荐)
把学生模型的公共字段和校验规则全部封装到基础模型中,创建和更新的入参模型分别继承基础模型做差异化改造即可,后续调整校验规则只需修改基类一处:
from pydantic import BaseModel, Field from typing import Optional # 公共基类:存放所有公共字段和校验规则 class StudentBase(BaseModel): first_name: str = Field(..., max_length=30) last_name: str = Field(..., max_length=30) age: int = Field(..., gt=15) group: str = Field(..., max_length=10) # 创建学生入参:直接继承基类,所有字段保持必填 class StudentIn(StudentBase): pass # 更新学生入参:继承基类后把所有字段改为可选,校验规则自动继承 # Pydantic V2 写法:直接用内置Partial工具自动生成全可选模型,无需手动重写字段 from pydantic.partial import Partial class StudentUpdateIn(Partial[StudentBase]): pass # Pydantic V1 写法:手动重写字段为Optional,校验规则会自动继承基类的Field配置 # class StudentUpdateIn(StudentBase): # first_name: Optional[str] # last_name: Optional[str] # age: Optional[int] # group: Optional[str]
这种方式下,age字段的gt=15校验会自动生效:如果请求传了age参数就会触发校验,没传就跳过,完全符合更新接口的逻辑。
方案2:抽离公共Field常量
如果不想改动现有模型的继承结构,可以把复用度高的Field配置抽成常量,两个模型直接引用即可:
from pydantic import BaseModel, Field from typing import Optional # 抽离公共校验配置 AGE_FIELD = Field(..., gt=15) FIRST_NAME_FIELD = Field(..., max_length=30) LAST_NAME_FIELD = Field(..., max_length=30) GROUP_FIELD = Field(..., max_length=10) class StudentIn(BaseModel): first_name: str = FIRST_NAME_FIELD last_name: str = LAST_NAME_FIELD age: int = AGE_FIELD group: str = GROUP_FIELD class StudentUpdateIn(BaseModel): first_name: Optional[str] = Field(None, **FIRST_NAME_FIELD.field_info) last_name: Optional[str] = Field(None, **LAST_NAME_FIELD.field_info) age: Optional[int] = Field(None, **AGE_FIELD.field_info) group: Optional[str] = Field(None, **GROUP_FIELD.field_info)
内容的提问来源于stack exchange,提问作者whoamins
相关产品推荐
相关产品推荐

