41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""
|
|
书影音收藏模型
|
|
"""
|
|
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")
|
|
|