scheme.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import json
  2. from datetime import datetime
  3. from pathlib import Path
  4. from typing import Optional, Dict, Any, List
  5. from pydantic import BaseModel, field_validator
  6. # --- Pydantic 数据模型 ---
  7. class CardImageResponse(BaseModel):
  8. """用于API响应的图片数据模型 (主键为 id)"""
  9. id: int
  10. card_id: int
  11. image_type: str
  12. image_name: Optional[str] = None
  13. image_path: str
  14. detection_json: Dict[str, Any]
  15. modified_json: Optional[Dict[str, Any]] = None
  16. created_at: datetime
  17. updated_at: datetime
  18. class Config:
  19. from_attributes = True
  20. @field_validator('image_path', mode='before')
  21. @classmethod
  22. def format_image_path(cls, v:str):
  23. """将绝对文件路径转换为 'Data/filename.jpg' 格式的相对URL路径"""
  24. if not isinstance(v, str) or not v:
  25. return v
  26. p = Path(v)
  27. relative_path = f"{p.parent.name}/{p.name}"
  28. return relative_path
  29. @field_validator('detection_json', 'modified_json', mode='before')
  30. @classmethod
  31. def parse_json_string(cls, v):
  32. if v is None:
  33. return None
  34. if isinstance(v, str):
  35. try:
  36. return json.loads(v)
  37. except json.JSONDecodeError:
  38. raise ValueError("Invalid JSON string in database")
  39. return v
  40. class CardDetailResponse(BaseModel):
  41. """用于响应单个卡牌详细信息的模型 (主键为 id)"""
  42. id: int
  43. card_name: Optional[str] = None
  44. created_at: datetime
  45. updated_at: datetime
  46. images: List[CardImageResponse] = []
  47. class Config:
  48. from_attributes = True
  49. class ImageJsonPairResponse(BaseModel):
  50. """用于获取单个图片两个JSON数据的响应模型 (主键为 id)"""
  51. id: int # 原 image_id
  52. detection_json: Dict[str, Any]
  53. modified_json: Optional[Dict[str, Any]] = None
  54. class Config:
  55. from_attributes = True
  56. @field_validator('detection_json', 'modified_json', mode='before')
  57. @classmethod
  58. def parse_json_string(cls, v):
  59. if v is None:
  60. return None
  61. if isinstance(v, str):
  62. try:
  63. return json.loads(v)
  64. except json.JSONDecodeError:
  65. raise ValueError("Invalid JSON string in database")
  66. return v
  67. class CardListDetailResponse(BaseModel):
  68. """为新的卡牌列表接口定义的响应模型 (主键为 id)"""
  69. id: int # 原 card_id
  70. card_name: Optional[str] = None
  71. created_at: datetime
  72. updated_at: datetime
  73. class Config:
  74. from_attributes = True