# schemas/stu_schema.py # 学生信息模块的 Pydantic 模式:请求体校验 & 响应序列化 from datetime import date from typing import Optional from pydantic import BaseModel, ConfigDict, Field class StuInfoBase(BaseModel): """学生信息公共字段""" cls_id: str = Field(..., max_length=15, description="所属班级编号") name: str = Field(..., max_length=20, description="姓名") gender: Optional[str] = Field(default="男", max_length=1, description="性别") age: Optional[int] = Field(default=None, ge=0, description="年龄") hometown: Optional[str] = Field(default=None, max_length=50, description="籍贯") grad_school: Optional[str] = Field(default=None, max_length=50, description="毕业院校") major: Optional[str] = Field(default=None, max_length=50, description="专业") education: Optional[str] = Field(default=None, max_length=20, description="学历") enr_date: Optional[date] = Field(default=None, description="入学日期") grad_date: Optional[date] = Field(default=None, description="毕业日期") advisor_id: Optional[str] = Field(default=None, max_length=15, description="顾问编号") state: Optional[str] = Field(default="在读", max_length=10, description="状态") class StuInfoCreate(StuInfoBase): """新增学生时,id(学号)必填""" id: str = Field(..., max_length=15, description="学生编号(主键)") class StuInfoUpdate(BaseModel): """更新学生信息:所有字段均可选,仅更新传入的字段""" cls_id: Optional[str] = Field(default=None, max_length=15, description="所属班级编号") name: Optional[str] = Field(default=None, max_length=20, description="姓名") gender: Optional[str] = Field(default=None, max_length=1, description="性别") age: Optional[int] = Field(default=None, ge=0, description="年龄") hometown: Optional[str] = Field(default=None, max_length=50, description="籍贯") grad_school: Optional[str] = Field(default=None, max_length=50, description="毕业院校") major: Optional[str] = Field(default=None, max_length=50, description="专业") education: Optional[str] = Field(default=None, max_length=20, description="学历") enr_date: Optional[date] = Field(default=None, description="入学日期") grad_date: Optional[date] = Field(default=None, description="毕业日期") advisor_id: Optional[str] = Field(default=None, max_length=15, description="顾问编号") state: Optional[str] = Field(default=None, max_length=10, description="状态") class StuInfoOut(StuInfoBase): """学生信息响应模型(含 id 与软删除标记)""" id: str is_deleted: int model_config = ConfigDict(from_attributes=True)