scheme.py 2.2 KB

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