import re from datetime import datetime from pydantic import BaseModel, Field, field_serializer, field_validator #进门校验钩子 from model.advisor_model import GenderEnum #顾问信息请求体数据进入模型 用Field进门校验 class AdvisorCreate(BaseModel): advisor_name:str =Field(...,min_length=2,max_length=10) # 电话:非必填;填了必须是11位纯数字 phone:str|None = None # 性别:枚举类型,只接受 男 / 女 gender:GenderEnum|None = None @field_validator("phone") @classmethod def validate_phone(cls,v): if v is None: return v if not re.fullmatch(r"\d{11}",v): raise ValueError("电话号码必须是11位纯数字") return v #顾问信息更改删除状态 class AdvisorStatus(BaseModel): flag: int = Field(ge=0, le=1) #顾问信息响应体返回模型 class StudentOut(BaseModel): student_no: str student_name: str enrollment_time: datetime graduation_time: datetime advisor_id: int class Config: from_attributes = True #允许 Pydantic 从 ORM 对象的属性上取值(student.student_name),而不是只从字典取——没有这行 class AdvisorOut(BaseModel): id:int advisor_name:str flag:int phone:str|None = None gender:GenderEnum|None = None class Config: from_attributes=True # 允许把 ORM 对象(Advisor)直接转成这个模型 @field_serializer("phone") def mask_phone(self,value): # 返回时把中间四位加密:13812345678 -> 138****5678 if value is None: return None return value[:3] + "****" + value[7:] #AdvisorCreate:数据是前端传来的 JSON, # FastAPI 直接把 JSON 转成这个对象.来源是"普通字典",所以什么都不用配。 #AdvisorOut:返回信息存在数据库里的 Advisor 对象的属性里