scheme.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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响应的图片数据模型"""
  8. image_id: int
  9. image_name: Optional[str] = None
  10. image_path: str
  11. detection_json: Dict[str, Any]
  12. modified_json: Optional[Dict[str, Any]] = None
  13. created_at: datetime
  14. updated_at: datetime
  15. class Config:
  16. from_attributes = True # 兼容 ORM 模式
  17. @field_validator('detection_json', 'modified_json', mode='before')
  18. @classmethod
  19. def parse_json_string(cls, v):
  20. if v is None:
  21. return None
  22. if isinstance(v, str):
  23. try:
  24. return json.loads(v)
  25. except json.JSONDecodeError:
  26. raise ValueError("Invalid JSON string in database")
  27. return v
  28. class CardDetailResponse(BaseModel):
  29. """用于响应单个卡牌详细信息的模型,包含其所有图片信息"""
  30. card_id: int
  31. card_name: Optional[str] = None
  32. created_at: datetime
  33. updated_at: datetime
  34. images: List[CardImageResponse] = [] # 嵌套的图片列表
  35. class Config:
  36. from_attributes = True
  37. class ImageJsonPairResponse(BaseModel):
  38. """用于获取单个图片两个JSON数据的响应模型"""
  39. image_id: int
  40. detection_json: Dict[str, Any]
  41. modified_json: Optional[Dict[str, Any]] = None
  42. class Config:
  43. from_attributes = True
  44. @field_validator('detection_json', 'modified_json', mode='before')
  45. @classmethod
  46. def parse_json_string(cls, v):
  47. """
  48. 这个验证器会在Pydantic进行类型检查之前运行。
  49. 它负责将从数据库取出的JSON字符串转换为Python字典。
  50. """
  51. if v is None:
  52. return None
  53. if isinstance(v, str):
  54. try:
  55. return json.loads(v)
  56. except json.JSONDecodeError:
  57. raise ValueError("Invalid JSON string in database")
  58. return v
  59. # 用于 card list的结构
  60. class CardImageInfo(BaseModel):
  61. """用于在卡牌列表中展示的单张图片摘要信息"""
  62. image_id: int
  63. image_name: Optional[str] = None
  64. class CardListDetailResponse(BaseModel):
  65. """为新的卡牌列表接口定义的详细响应模型"""
  66. card_id: int
  67. card_name: Optional[str] = None
  68. created_at: datetime
  69. updated_at: datetime
  70. # 使用嵌套模型来表示每张图片的信息
  71. front_face: Optional[CardImageInfo] = None
  72. back_face: Optional[CardImageInfo] = None
  73. front_edge: Optional[CardImageInfo] = None
  74. back_edge: Optional[CardImageInfo] = None
  75. class Config:
  76. from_attributes = True