import json from datetime import datetime from typing import Optional, Dict, Any, List from pydantic import BaseModel, field_validator # --- Pydantic 数据模型 --- class CardImageResponse(BaseModel): """用于API响应的图片数据模型""" image_id: int image_name: Optional[str] = None image_path: str detection_json: Dict[str, Any] modified_json: Optional[Dict[str, Any]] = None created_at: datetime updated_at: datetime class Config: from_attributes = True # 兼容 ORM 模式 @field_validator('detection_json', 'modified_json', mode='before') @classmethod def parse_json_string(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except json.JSONDecodeError: raise ValueError("Invalid JSON string in database") return v class CardDetailResponse(BaseModel): """用于响应单个卡牌详细信息的模型,包含其所有图片信息""" card_id: int card_name: Optional[str] = None created_at: datetime updated_at: datetime images: List[CardImageResponse] = [] # 嵌套的图片列表 class Config: from_attributes = True class ImageJsonPairResponse(BaseModel): """用于获取单个图片两个JSON数据的响应模型""" image_id: int detection_json: Dict[str, Any] modified_json: Optional[Dict[str, Any]] = None class Config: from_attributes = True @field_validator('detection_json', 'modified_json', mode='before') @classmethod def parse_json_string(cls, v): """ 这个验证器会在Pydantic进行类型检查之前运行。 它负责将从数据库取出的JSON字符串转换为Python字典。 """ if v is None: return None if isinstance(v, str): try: return json.loads(v) except json.JSONDecodeError: raise ValueError("Invalid JSON string in database") return v # 用于 card list的结构 class CardImageInfo(BaseModel): """用于在卡牌列表中展示的单张图片摘要信息""" image_id: int image_name: Optional[str] = None class CardListDetailResponse(BaseModel): """为新的卡牌列表接口定义的详细响应模型""" card_id: int card_name: Optional[str] = None created_at: datetime updated_at: datetime # 使用嵌套模型来表示每张图片的信息 front_face: Optional[CardImageInfo] = None back_face: Optional[CardImageInfo] = None front_edge: Optional[CardImageInfo] = None back_edge: Optional[CardImageInfo] = None class Config: from_attributes = True