Files
wo_chovy/schema/advisor_schema.py
2026-09-21 19:49:26 +08:00

56 lines
1.9 KiB
Python

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 对象的属性里