schema.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import json
  2. from pydantic import BaseModel, field_validator, Field, ConfigDict
  3. from typing import Optional, Dict, Any
  4. from datetime import datetime
  5. class VasSchemaBase(BaseModel):
  6. name: Optional[str] = None
  7. description: Optional[str] = None
  8. # 1. 将字段重命名为 schema_content (避免与 BaseModel.schema_json 冲突)
  9. # 2. 使用 alias="schema_json" 确保前端传参或数据库读取时 key 仍然是 "schema_json"
  10. schema_content: Optional[Dict[str, Any]] = Field(default=None, alias="schema_json")
  11. # 配置允许通过字段名或别名进行赋值
  12. model_config = ConfigDict(populate_by_name=True)
  13. # 3. 验证器指向新的字段名 schema_content
  14. @field_validator("schema_content", mode="before")
  15. def normalize_json_field(cls, v):
  16. if v is None:
  17. return None
  18. if isinstance(v, str):
  19. try:
  20. return json.loads(v)
  21. except Exception:
  22. return {}
  23. return v
  24. class VasSchemaCreate(VasSchemaBase):
  25. name: str
  26. description: str
  27. # 这里也要重命名,并加上 alias
  28. schema_content: Dict[str, Any] = Field(..., alias="schema_json")
  29. class VasSchemaUpdate(VasSchemaBase):
  30. pass
  31. class VasSchemaOut(VasSchemaBase):
  32. id: int
  33. created_at: datetime
  34. updated_at: datetime
  35. # 继承 Base 的配置,并在其基础上增加 from_attributes
  36. model_config = ConfigDict(
  37. populate_by_name=True,
  38. from_attributes=True
  39. )