"""API 请求/响应模型(pydantic v2)。""" from __future__ import annotations from datetime import date, datetime from typing import List, Optional from pydantic import BaseModel, Field # ---------------- 事件 ---------------- class EventIn(BaseModel): event_date: date title: str = Field(min_length=1, max_length=255) category: str = "其他" impact_direction: str = "neutral" # bullish/bearish/neutral severity: int = Field(default=3, ge=1, le=5) related_indices: Optional[str] = None # CSV,如 "000001.SH,399006.SZ" cycle_tag: str = "none" # top/bottom/none description: Optional[str] = None source_url: Optional[str] = None class EventOut(EventIn): id: int source: str = "manual" created_at: Optional[datetime] = None updated_at: Optional[datetime] = None model_config = {"from_attributes": True} # ---------------- ETF ---------------- class EtfFlowIn(BaseModel): trade_date: date etf_code: str = "" etf_name: Optional[str] = None category: Optional[str] = None related_index: Optional[str] = None net_inflow: Optional[float] = None # 亿元 shares_change: Optional[float] = None note: Optional[str] = None class EtfFlowOut(EtfFlowIn): id: int source: str = "manual" created_at: Optional[datetime] = None model_config = {"from_attributes": True} # ---------------- 顶底人工标注 ---------------- class AnnotationIn(BaseModel): index_code: str anno_date: date kind: str = "watch" # top/bottom/watch note: Optional[str] = None # ---------------- 导入结果 ---------------- class ImportResult(BaseModel): inserted: int updated: int total: int errors: List[str] = []