from datetime import date from typing import Self,List from pydantic import BaseModel, field_serializer, field_validator,model_validator,ConfigDict class StudentRequest(BaseModel): class_id:int |None = None stu_name:str age:int |None = None gender:str |None = None id_card:str native_place:str |None = None birthday:date |None = None school:str |None = None major:str |None = None degree:str |None = None admission_date:date |None = None graduation_date:date |None = None @field_validator('age') @classmethod def check_age(cls, v): if v is not None and v < 0: raise ValueError('年龄不能为负数') return v @model_validator(mode='after') def check_admission_graduation(self) -> Self: if self.admission_date and self.graduation_date: if self.admission_date > self.graduation_date: raise ValueError ('入学日期不能晚于毕业日期') return self class StuUpdateRequest(BaseModel): class_id: int | None = None stu_name: str | None = None age: int | None = None gender: str | None = None id_card: str | None = None native_place: str | None = None birthday: date | None = None school: str | None = None major: str | None = None degree: str | None = None admission_date: date | None = None graduation_date: date | None = None progress: int | None = None @field_validator('age') @classmethod def check_age(cls, v): if v is not None and v < 0: raise ValueError('年龄不能为负数') return v @model_validator(mode='after') def check_admission_graduation(self) -> Self: if self.admission_date and self.graduation_date: if self.admission_date > self.graduation_date: raise ValueError('入学日期不能晚于毕业日期') return self class StugetResponse(BaseModel): model_config = ConfigDict(from_attributes=True) code:int = 200 detail:str = 'ok' stu_id:int | None = None class_id: int | None = None stu_name: str | None = None age: int | None = None gender: str | None = None id_card: str | None = None native_place: str | None = None birthday: date | None = None school: str | None = None major: str | None = None degree: str | None = None admission_date: date | None = None graduation_date: date | None = None progress: int @field_serializer('progress') def progress_to_label(self, progress): d1 = { 0: '学习中', 1: '求职中', 2: '已就业' } try: return d1.get(int(progress), '暂不明确') except (TypeError, ValueError): return progress class StuPageResponse(BaseModel): code: int = 200 detail: str = "ok" page: int page_size: int totals: int data: List[StugetResponse]