import json from pydantic import BaseModel, field_validator, Field, ConfigDict from typing import Optional, Dict, Any from datetime import datetime class VasSchemaBase(BaseModel): name: Optional[str] = None description: Optional[str] = None # 1. 将字段重命名为 schema_content (避免与 BaseModel.schema_json 冲突) # 2. 使用 alias="schema_json" 确保前端传参或数据库读取时 key 仍然是 "schema_json" schema_content: Optional[Dict[str, Any]] = Field(default=None, alias="schema_json") # 配置允许通过字段名或别名进行赋值 model_config = ConfigDict(populate_by_name=True) # 3. 验证器指向新的字段名 schema_content @field_validator("schema_content", mode="before") def normalize_json_field(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except Exception: return {} return v class VasSchemaCreate(VasSchemaBase): name: str description: str # 这里也要重命名,并加上 alias schema_content: Dict[str, Any] = Field(..., alias="schema_json") class VasSchemaUpdate(VasSchemaBase): pass class VasSchemaOut(VasSchemaBase): id: int created_at: datetime updated_at: datetime # 继承 Base 的配置,并在其基础上增加 from_attributes model_config = ConfigDict( populate_by_name=True, from_attributes=True )