import json from pydantic import BaseModel, field_validator from typing import Optional, Dict, Any, Literal from datetime import datetime class AccountBase(BaseModel): pool_name: str username: str password: Optional[str] = None extra_data: Optional[Dict[str, Any]] = None status: Optional[Literal['active','disable']] = None next_use_time: Optional[datetime] = None @field_validator("extra_data", 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 # --- 4. 请求/响应 Schema (Pydantic) --- class AccountCreate(AccountBase): pass class AccountUpdate(AccountBase): """ 更新代理 Payload 注意:因为是更新,前端可能只传部分字段,所以这里全部重新定义为 Optional """ pool_name: Optional[str] = None username: Optional[str] = None password: Optional[str] = None extra_data: Optional[Dict[str, Any]] = None next_use_time: Optional[datetime] = None status: Optional[str] = None class AccountOut(AccountBase): id: int created_at: datetime updated_at: datetime model_config = { "from_attributes": True } class GetNextAccountPayload(BaseModel): """获取下个IP的请求参数""" pool_name: str account_cd: int