scheme.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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('detection_json', 'modified_json', mode='before')
  21. @classmethod
  22. def parse_json_string(cls, v):
  23. if v is None:
  24. return None
  25. if isinstance(v, str):
  26. try:
  27. return json.loads(v)
  28. except json.JSONDecodeError:
  29. raise ValueError("Invalid JSON string in database")
  30. return v
  31. class CardDetailResponse(BaseModel):
  32. """用于响应单个卡牌详细信息的模型 (主键为 id)"""
  33. id: int
  34. card_name: Optional[str] = None
  35. created_at: datetime
  36. updated_at: datetime
  37. score: Optional[float] = None
  38. images: List[CardImageResponse] = []
  39. class Config:
  40. from_attributes = True
  41. class ImageJsonPairResponse(BaseModel):
  42. """用于获取单个图片两个JSON数据的响应模型 (主键为 id)"""
  43. id: int # 原 image_id
  44. detection_json: Dict[str, Any]
  45. modified_json: Optional[Dict[str, Any]] = None
  46. class Config:
  47. from_attributes = True
  48. @field_validator('detection_json', 'modified_json', mode='before')
  49. @classmethod
  50. def parse_json_string(cls, v):
  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. class CardListDetailResponse(BaseModel):
  60. """为新的卡牌列表接口定义的响应模型 (主键为 id)"""
  61. id: int # 原 card_id
  62. card_name: Optional[str] = None
  63. created_at: datetime
  64. updated_at: datetime
  65. class Config:
  66. from_attributes = True