现实业务里经常会遇到跨字段规则:
- 加急申请时,备注不能为空
- 夜间区域申请不能超过 3 天
Pydantic v2 的典型写法是:
field_validatormodel_validator
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