101 lines
3.9 KiB
Python
101 lines
3.9 KiB
Python
"""
|
||
StarSystem Pydantic Models
|
||
恒星系统数据模型(用于API)
|
||
"""
|
||
from typing import Optional, List
|
||
from pydantic import BaseModel, Field
|
||
from datetime import datetime
|
||
|
||
|
||
class StarSystemBase(BaseModel):
|
||
"""恒星系统基础模型"""
|
||
name: str = Field(..., description="恒星系名称")
|
||
name_zh: Optional[str] = Field(None, description="中文名称")
|
||
host_star_name: str = Field(..., description="主恒星名称")
|
||
|
||
# 位置信息
|
||
distance_pc: Optional[float] = Field(None, description="距离地球(秒差距)")
|
||
distance_ly: Optional[float] = Field(None, description="距离地球(光年)")
|
||
ra: Optional[float] = Field(None, description="赤经(度)")
|
||
dec: Optional[float] = Field(None, description="赤纬(度)")
|
||
position_x: Optional[float] = Field(None, description="笛卡尔坐标 X(pc)")
|
||
position_y: Optional[float] = Field(None, description="笛卡尔坐标 Y(pc)")
|
||
position_z: Optional[float] = Field(None, description="笛卡尔坐标 Z(pc)")
|
||
|
||
# 恒星参数
|
||
spectral_type: Optional[str] = Field(None, description="光谱类型")
|
||
radius_solar: Optional[float] = Field(None, description="恒星半径(太阳半径)")
|
||
mass_solar: Optional[float] = Field(None, description="恒星质量(太阳质量)")
|
||
temperature_k: Optional[float] = Field(None, description="表面温度(K)")
|
||
magnitude: Optional[float] = Field(None, description="视星等")
|
||
luminosity_solar: Optional[float] = Field(None, description="光度(太阳光度)")
|
||
|
||
# 显示属性
|
||
color: Optional[str] = Field(None, description="显示颜色(HEX)")
|
||
|
||
# 描述
|
||
description: Optional[str] = Field(None, description="描述")
|
||
details: Optional[str] = Field(None, description="详细信息(Markdown)")
|
||
|
||
|
||
class StarSystemCreate(StarSystemBase):
|
||
"""创建恒星系统"""
|
||
pass
|
||
|
||
|
||
class StarSystemUpdate(BaseModel):
|
||
"""更新恒星系统(所有字段可选)"""
|
||
name: Optional[str] = None
|
||
name_zh: Optional[str] = None
|
||
host_star_name: Optional[str] = None
|
||
distance_pc: Optional[float] = None
|
||
distance_ly: Optional[float] = None
|
||
ra: Optional[float] = None
|
||
dec: Optional[float] = None
|
||
position_x: Optional[float] = None
|
||
position_y: Optional[float] = None
|
||
position_z: Optional[float] = None
|
||
spectral_type: Optional[str] = None
|
||
radius_solar: Optional[float] = None
|
||
mass_solar: Optional[float] = None
|
||
temperature_k: Optional[float] = None
|
||
magnitude: Optional[float] = None
|
||
luminosity_solar: Optional[float] = None
|
||
color: Optional[str] = None
|
||
description: Optional[str] = None
|
||
details: Optional[str] = None
|
||
|
||
|
||
class StarSystemResponse(StarSystemBase):
|
||
"""恒星系统响应模型"""
|
||
id: int
|
||
planet_count: int = Field(default=0, description="已知行星数量")
|
||
star_count: int = Field(default=1, description="恒星数量(包括主星和伴星)")
|
||
created_at: datetime
|
||
updated_at: datetime
|
||
|
||
class Config:
|
||
from_attributes = True
|
||
|
||
|
||
class StarSystemWithBodies(StarSystemResponse):
|
||
"""包含天体的恒星系统"""
|
||
bodies: List[dict] = Field(default_factory=list, description="关联的天体列表")
|
||
body_count: int = Field(default=0, description="天体数量")
|
||
|
||
|
||
class StarSystemListResponse(BaseModel):
|
||
"""恒星系统列表响应"""
|
||
total: int
|
||
systems: List[StarSystemResponse]
|
||
|
||
|
||
class StarSystemStatistics(BaseModel):
|
||
"""恒星系统统计信息"""
|
||
total_systems: int = Field(..., description="总恒星系统数")
|
||
exo_systems: int = Field(..., description="系外恒星系统数")
|
||
total_planets: int = Field(..., description="总行星数")
|
||
exo_planets: int = Field(..., description="系外行星数")
|
||
solar_system_planets: int = Field(..., description="太阳系行星数")
|
||
nearest_systems: List[dict] = Field(default_factory=list, description="最近的10个恒星系统")
|