# 校验时间,入学时间小于毕业时间, from datetime import datetime from datetime import date from pydantic import BaseModel, field_validator, Field, ConfigDict # 请求体模型:两个日期都允许为空 在api.studend调用检测 class StudentDate(BaseModel): enrollment_date: str | None = Field(default=None, description="入学日期,格式为 yyyy-MM-dd,非必填") graduation_date: str | None = Field(default=None, description="毕业日期,格式 yyyy-MM-dd,非必填") # 日期校验函数 def student_date(enrollment_date: str , graduation_date: str): # 情况1:两个日期都没传,直接通过 if not enrollment_date and not graduation_date: return "时间校验通过" # 只传了入学日期或者毕业日期,只校验格式 if enrollment_date and not graduation_date: try: datetime.strptime(enrollment_date, "%Y-%m-%d") except ValueError: return "入学日期格式错误,请按照 yyyy-MM-dd 输入" return "时间校验通过" elif graduation_date and not enrollment_date: try: datetime.strptime(graduation_date, "%Y-%m-%d") except ValueError: return "毕业日期格式错误,请按照 yyyy-MM-dd 输入" return "时间校验通过" # 如果两个日期都传了,先分别校验格式,再校验先后顺序 try: enrollment_date = datetime.strptime(enrollment_date, "%Y-%m-%d") except ValueError: return "入学日期格式错误,请按照 yyyy-MM-dd 输入" try: graduation_date = datetime.strptime(graduation_date, "%Y-%m-%d") except ValueError: return "毕业日期格式错误,请按照 yyyy-MM-dd 输入" # 核心业务判断:毕业时间不能早于入学时间 if graduation_date < enrollment_date: return "毕业时间必须晚于入学时间" return "时间校验通过" #创建学生的请求体 ...(必填) class StudentCreate(BaseModel): id: str = Field(..., min_length=1, max_length=20, description="学号") name: str = Field(..., min_length=1, max_length=50, description="学生姓名") gender: str = Field(..., pattern=r"^(男|女)$", description="性别:男/女") class_name: str = Field(..., min_length=1, max_length=20, description="所属班级编号") #非必填 age: int | None = Field(default=None, ge=1, le=100, description="年龄") hometown: str | None = Field(default=None, max_length=100, description="籍贯") graduate_school: str | None = Field(default=None, max_length=100, description="毕业院校") major: str | None = Field(default=None, max_length=50, description="专业") education: str | None = Field(default=None, max_length=30, description="学历:专科/本科/硕士") enrollment_date: date | None = Field(default=None, description="入学时间,格式yyyy-MM-dd") graduation_date: date | None = Field(default=None, description="毕业时间,格式yyyy-MM-dd") status: str | None = Field(default="在读", description="状态:未毕业/进入就业/已就业") # 更新修改学生 class StudentUpdate(BaseModel): name: str | None = Field(default=None, min_length=1, max_length=50, description="学生姓名") class_name: str | None = Field(default=None, description="班级名称") gender: str | None = Field(default=None, pattern=r"^(男|女)$", description="性别:男/女") class_no: str | None = Field(default=None, max_length=20, description="所属班级编号") age: int | None = Field(default=None, ge=1, le=100, description="年龄") hometown: str | None = Field(default=None, max_length=100, description="籍贯") graduate_school: str | None = Field(default=None, max_length=100, description="毕业院校") major: str | None = Field(default=None, max_length=50, description="专业") education: str | None = Field(default=None, max_length=30, description="学历") enrollment_date: date | None = Field(default=None, description="入学时间") graduation_date: date | None = Field(default=None, description="毕业时间") status: str | None = Field(default=None, description="状态:未毕业/进入就业/已就业") # 响应体 class StudentResponse(BaseModel): model_config = ConfigDict(from_attributes=True) #支持读取SQLAlchemy ORM对象属性 id: str name: str gender: str class_name: str | None = None age: int | None = None hometown: str | None = None graduate_school: str | None = None major: str | None = None education: str | None = None enrollment_date: date | None = None graduation_date: date | None = None status: str | None = None is_deleted: bool = False