初始版本
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
"""
|
||||
数据库模型模块
|
||||
"""
|
||||
from .user import User
|
||||
from .todo import Todo
|
||||
from .post import Post
|
||||
from .transaction import Transaction
|
||||
from .media import Media, Tag, MediaTag
|
||||
from .chat import ChatMessage
|
||||
from .upload import Upload
|
||||
|
||||
__all__ = [
|
||||
"User",
|
||||
"Todo",
|
||||
"Post",
|
||||
"Transaction",
|
||||
"Media",
|
||||
"Tag",
|
||||
"MediaTag",
|
||||
"ChatMessage",
|
||||
"Upload",
|
||||
]
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
"""
|
||||
书影音收藏模型
|
||||
"""
|
||||
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")
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
"""
|
||||
博客文章模型
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
from .user import User
|
||||
|
||||
|
||||
class Post(SQLModel, table=True):
|
||||
"""博客文章表"""
|
||||
__tablename__ = "posts"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
title: str = Field(max_length=200)
|
||||
slug: str = Field(max_length=200, index=True)
|
||||
content: str # 支持 Markdown
|
||||
created_at: datetime = Field(default_factory=datetime.now)
|
||||
updated_at: Optional[datetime] = Field(default=None)
|
||||
user_id: int = Field(foreign_key="users.id", index=True)
|
||||
|
||||
# 关系
|
||||
user: Optional[User] = Relationship()
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
"""
|
||||
媒体标签模型
|
||||
"""
|
||||
from typing import Optional, TYPE_CHECKING
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .media import Media, MediaTag
|
||||
else:
|
||||
Media = "Media"
|
||||
MediaTag = "MediaTag"
|
||||
|
||||
|
||||
class Tag(SQLModel, table=True):
|
||||
"""媒体标签表"""
|
||||
__tablename__ = "tags"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(max_length=50, unique=True, index=True)
|
||||
|
||||
# 关系
|
||||
media: list["Media"] = Relationship(back_populates="tags", link_model="MediaTag")
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
"""
|
||||
待办事项模型
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
from .user import User
|
||||
|
||||
|
||||
class Todo(SQLModel, table=True):
|
||||
"""待办事项表"""
|
||||
__tablename__ = "todos"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
title: str = Field(max_length=200)
|
||||
done: bool = Field(default=False)
|
||||
created_at: datetime = Field(default_factory=datetime.now)
|
||||
user_id: int = Field(foreign_key="users.id", index=True)
|
||||
|
||||
# 关系(可选,用于ORM查询)
|
||||
user: Optional[User] = Relationship()
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
"""
|
||||
记账记录模型
|
||||
"""
|
||||
from datetime import date
|
||||
from typing import Optional
|
||||
from decimal import Decimal
|
||||
from sqlmodel import SQLModel, Field, Relationship, Column
|
||||
from sqlalchemy import Numeric
|
||||
from .user import User
|
||||
|
||||
|
||||
class Transaction(SQLModel, table=True):
|
||||
"""记账记录表"""
|
||||
__tablename__ = "transactions"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
amount: Decimal = Field(sa_column=Column(Numeric(10, 2))) # 正数为收入,负数为支出
|
||||
category: str = Field(max_length=50)
|
||||
description: Optional[str] = Field(default=None, max_length=200)
|
||||
date: date
|
||||
user_id: int = Field(foreign_key="users.id", index=True)
|
||||
|
||||
# 关系
|
||||
user: Optional[User] = Relationship()
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
"""
|
||||
文件上传模型
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
from .user import User
|
||||
|
||||
|
||||
class Upload(SQLModel, table=True):
|
||||
"""文件上传记录表"""
|
||||
__tablename__ = "uploads"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
filename: str = Field(max_length=200)
|
||||
stored_path: str = Field(max_length=300)
|
||||
file_size: int # 字节数
|
||||
mime_type: str = Field(max_length=100)
|
||||
uploaded_at: datetime = Field(default_factory=datetime.now)
|
||||
expires_at: Optional[datetime] = Field(default=None)
|
||||
user_id: int = Field(foreign_key="users.id", index=True)
|
||||
|
||||
# 关系
|
||||
user: Optional[User] = Relationship()
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
"""
|
||||
用户模型
|
||||
"""
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from sqlmodel import SQLModel, Field
|
||||
|
||||
|
||||
class User(SQLModel, table=True):
|
||||
"""用户表"""
|
||||
__tablename__ = "users"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
username: str = Field(max_length=50, unique=True, index=True)
|
||||
email: Optional[str] = Field(default=None, max_length=100, unique=True, index=True)
|
||||
hashed_password: str
|
||||
created_at: datetime = Field(default_factory=datetime.now)
|
||||
|
||||
Reference in New Issue
Block a user