全书目录

第二篇:FastAPI 完全指南 —— 软件城市政务大厅宇宙

第八章:自定义校验器 —— 不是所有规则都能靠 int 和 str 解决

1 分钟 96 字 第 54 / 962 个阅读单元

现实业务里经常会遇到跨字段规则:

  • 加急申请时,备注不能为空
  • 夜间区域申请不能超过 3 天

Pydantic v2 的典型写法是:

  • field_validator
  • model_validator
py
from pydantic import BaseModel, Field, field_validator, model_validator

class PermitCreate(BaseModel):
    owner: str = Field(min_length=2, max_length=20)
    zone: str = Field(pattern=r"^[A-Z]-\d{2}$")
    days: int = Field(gt=0, le=30)
    urgent: bool = False
    note: str | None = None

    @field_validator("owner", mode="after")
    @classmethod
    def normalize_owner(cls, value: str) -> str:
        return value.strip()

    @model_validator(mode="after")
    def check_urgent_note(self):
        if self.urgent and not self.note:
            raise ValueError("加急申请必须填写备注")
        return self