43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
|
|
"""Portfolio models (포트폴리오)."""
|
||
|
|
from sqlalchemy import Column, String, Text, Numeric, DateTime, ForeignKey
|
||
|
|
from sqlalchemy.dialects.postgresql import UUID
|
||
|
|
from sqlalchemy.orm import relationship
|
||
|
|
import uuid
|
||
|
|
from datetime import datetime
|
||
|
|
from app.database import Base
|
||
|
|
|
||
|
|
|
||
|
|
class Portfolio(Base):
|
||
|
|
"""Portfolio model (퇴직연금 포트폴리오)."""
|
||
|
|
|
||
|
|
__tablename__ = "portfolios"
|
||
|
|
|
||
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||
|
|
name = Column(String(100), nullable=False)
|
||
|
|
description = Column(Text)
|
||
|
|
user_id = Column(String(100)) # 사용자 ID (향후 인증 시스템 연동)
|
||
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
||
|
|
|
||
|
|
# Relationship
|
||
|
|
assets = relationship("PortfolioAsset", back_populates="portfolio", cascade="all, delete-orphan")
|
||
|
|
|
||
|
|
def __repr__(self):
|
||
|
|
return f"<Portfolio(id={self.id}, name={self.name})>"
|
||
|
|
|
||
|
|
|
||
|
|
class PortfolioAsset(Base):
|
||
|
|
"""Portfolio asset model (포트폴리오 자산 목표 비율)."""
|
||
|
|
|
||
|
|
__tablename__ = "portfolio_assets"
|
||
|
|
|
||
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||
|
|
portfolio_id = Column(UUID(as_uuid=True), ForeignKey("portfolios.id"), nullable=False)
|
||
|
|
ticker = Column(String(20), nullable=False)
|
||
|
|
target_ratio = Column(Numeric(5, 2), nullable=False) # 목표 비율 (%)
|
||
|
|
|
||
|
|
# Relationship
|
||
|
|
portfolio = relationship("Portfolio", back_populates="assets")
|
||
|
|
|
||
|
|
def __repr__(self):
|
||
|
|
return f"<PortfolioAsset(portfolio_id={self.portfolio_id}, ticker={self.ticker}, target_ratio={self.target_ratio})>"
|