""" 书影音收藏模型 """ from datetime import datetime from typing import Optional, TYPE_CHECKING from sqlmodel import SQLModel, Field, Relationship from .user import User if TYPE_CHECKING: from .tag import Tag else: Tag = "Tag" class MediaTag(SQLModel, table=True): """媒体-标签关联表""" __tablename__ = "media_tags" media_id: int = Field(foreign_key="media.id", primary_key=True) tag_id: int = Field(foreign_key="tags.id", primary_key=True) class Media(SQLModel, table=True): """书影音收藏表""" __tablename__ = "media" id: Optional[int] = Field(default=None, primary_key=True) title: str = Field(max_length=200) media_type: str = Field(max_length=20) # book / movie / music rating: Optional[float] = Field(default=None, ge=0.0, le=5.0) comment: Optional[str] = Field(default=None) external_id: Optional[str] = Field(default=None, max_length=100) # ISBN、IMDb ID等 cover_url: Optional[str] = Field(default=None, max_length=300) created_at: datetime = Field(default_factory=datetime.now) user_id: int = Field(foreign_key="users.id", index=True) # 关系 user: Optional[User] = Relationship() tags: list["Tag"] = Relationship(back_populates="media", link_model="MediaTag")