重构模型基类

This commit is contained in:
2025-09-26 06:18:59 +08:00
parent 2a173c0566
commit cf5539f3c2
24 changed files with 43 additions and 45 deletions

View File

@@ -3,7 +3,7 @@
from . import response
# 将所有模型导入到这个包的命名空间中
from .base import BaseModel
from .base import TableBase
from .download import Download
from .file import File
from .folder import Folder
@@ -24,7 +24,7 @@ from .webdav import WebDAV
# 可以定义一个 __all__ 列表来明确指定可以被 from .models import * 导入的内容
__all__ = [
"BaseModel", "Download", "File", "Folder", "Group", "Node", "Order",
"TableBase", "Download", "File", "Folder", "Group", "Node", "Order",
"Policy", "Redeem", "Report", "Setting", "Share", "SourceLink",
"StoragePack", "Tag", "Task", "User", "WebDAV"
]

View File

@@ -6,7 +6,7 @@ from sqlalchemy.ext.asyncio import AsyncAttrs
utcnow = lambda: datetime.now(tz=timezone.utc)
class BaseModel(SQLModel, AsyncAttrs):
class TableBase(SQLModel, AsyncAttrs):
__abstract__ = True
id: Optional[int] = Field(default=None, primary_key=True, description="主键ID")

View File

@@ -1,5 +1,3 @@
# my_project/database.py
from sqlmodel import SQLModel
from sqlalchemy.ext.asyncio import AsyncEngine, create_async_engine
from sqlmodel.ext.asyncio.session import AsyncSession

View File

@@ -2,7 +2,7 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
@@ -10,7 +10,7 @@ if TYPE_CHECKING:
from .task import Task
from .node import Node
class Download(BaseModel, table=True):
class Download(TableBase, table=True):
__tablename__ = 'downloads'
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="下载状态: 0=进行中, 1=完成, 2=错误")

View File

@@ -2,7 +2,7 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
from .policy import Policy
from .source_link import SourceLink
class File(BaseModel, table=True):
class File(TableBase, table=True):
__tablename__ = 'files'
name: str = Field(max_length=255, description="文件名")

View File

@@ -2,7 +2,7 @@
from typing import Optional, List, TYPE_CHECKING
from sqlmodel import Field, Relationship, UniqueConstraint, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
@@ -10,7 +10,7 @@ if TYPE_CHECKING:
from .policy import Policy
from .file import File
class Folder(BaseModel, table=True):
class Folder(TableBase, table=True):
__tablename__ = 'folders'
__table_args__ = (UniqueConstraint("name", "parent_id", name="uq_folder_name_parent"),)

View File

@@ -3,13 +3,13 @@
from tokenize import group
from typing import Optional, List, TYPE_CHECKING
from sqlmodel import Field, Relationship, text, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .user import User
class Group(BaseModel, table=True):
class Group(TableBase, table=True):
__tablename__ = 'groups'
name: str = Field(max_length=255, unique=True, description="用户组名")
@@ -17,6 +17,7 @@ class Group(BaseModel, table=True):
max_storage: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="最大存储空间(字节)")
share_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}, description="是否允许创建分享")
web_dav_enabled: bool = Field(default=False, sa_column_kwargs={"server_default": text("false")}, description="是否允许使用WebDAV")
admin: bool = Field(default=False, description="是否为管理员组")
speed_limit: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="速度限制 (KB/s), 0为不限制")
options: Optional[str] = Field(default=None, description="其他选项 (JSON格式)")

View File

@@ -2,13 +2,13 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, text, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .download import Download
class Node(BaseModel, table=True):
class Node(TableBase, table=True):
__tablename__ = 'nodes'
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="节点状态: 0=正常, 1=离线")

View File

@@ -2,13 +2,13 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .user import User
class Order(BaseModel, table=True):
class Order(TableBase, table=True):
__tablename__ = 'orders'
order_no: str = Field(max_length=255, unique=True, index=True, description="订单号,唯一")

View File

@@ -2,14 +2,14 @@
from typing import Optional, List, TYPE_CHECKING
from sqlmodel import Field, Relationship, text, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .file import File
from .folder import Folder
class Policy(BaseModel, table=True):
class Policy(TableBase, table=True):
__tablename__ = 'policies'
name: str = Field(max_length=255, unique=True, description="策略名称")

View File

@@ -2,10 +2,10 @@
from typing import Optional
from sqlmodel import Field, text, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
class Redeem(BaseModel, table=True):
class Redeem(TableBase, table=True):
__tablename__ = 'redeems'
type: int = Field(description="兑换码类型")

View File

@@ -2,13 +2,13 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .share import Share
class Report(BaseModel, table=True):
class Report(TableBase, table=True):
__tablename__ = 'reports'
reason: int = Field(description="举报原因代码")

View File

@@ -107,7 +107,7 @@ class UserSettingModel(BaseModel):
two_factor: bool = Field(default=False, description="是否启用两步验证")
uid: int = Field(default=0, description="用户UID")
class FoldObjectModel(BaseModel):
class ObjectModel(BaseModel):
id: str = Field(default=..., description="对象ID")
name: str = Field(default=..., description="对象名称")
path: str = Field(default=..., description="对象路径")
@@ -133,5 +133,5 @@ class DirectoryModel(BaseModel):
目录模型
'''
parent: str = Field(default=..., description="父目录ID")
objects: list[FoldObjectModel] = Field(default_factory=list, description="目录下的对象列表")
objects: list[ObjectModel] = Field(default_factory=list, description="目录下的对象列表")
policy: PolicyModel = Field(default_factory=PolicyModel, description="存储策略")

View File

@@ -2,7 +2,7 @@
from typing import Optional, Literal
from sqlmodel import Field, UniqueConstraint, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
SETTINGS_TYPE = Literal[
@@ -34,7 +34,7 @@ SETTINGS_TYPE = Literal[
]
# 数据库模型
class Setting(BaseModel, table=True):
class Setting(TableBase, table=True):
__tablename__ = 'settings'
__table_args__ = (UniqueConstraint("type", "name", name="uq_setting_type_name"),)

View File

@@ -3,14 +3,14 @@
from typing import Optional, TYPE_CHECKING
from datetime import datetime
from sqlmodel import Field, Relationship, text, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .user import User
from .report import Report
class Share(BaseModel, table=True):
class Share(TableBase, table=True):
__tablename__ = 'shares'
password: Optional[str] = Field(default=None, max_length=255, description="分享密码(加密后)")

View File

@@ -2,13 +2,13 @@
from typing import TYPE_CHECKING, Optional
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .file import File
class SourceLink(BaseModel, table=True):
class SourceLink(TableBase, table=True):
__tablename__ = 'source_links'
name: str = Field(max_length=255, description="链接名称")

View File

@@ -3,13 +3,13 @@
from typing import Optional, TYPE_CHECKING
from datetime import datetime
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .user import User
class StoragePack(BaseModel, table=True):
class StoragePack(TableBase, table=True):
__tablename__ = 'storage_packs'
name: str = Field(max_length=255, description="容量包名称")

View File

@@ -2,13 +2,13 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, UniqueConstraint, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .user import User
class Tag(BaseModel, table=True):
class Tag(TableBase, table=True):
__tablename__ = 'tags'
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_tag_name_user"),)

View File

@@ -2,14 +2,14 @@
from typing import Optional, TYPE_CHECKING
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from datetime import datetime
if TYPE_CHECKING:
from .user import User
from .download import Download
class Task(BaseModel, table=True):
class Task(TableBase, table=True):
__tablename__ = 'tasks'
status: int = Field(default=0, sa_column_kwargs={"server_default": "0"}, description="任务状态: 0=排队中, 1=处理中, 2=完成, 3=错误")

View File

@@ -3,7 +3,7 @@
from typing import Optional, TYPE_CHECKING
from datetime import datetime
from sqlmodel import Field, Relationship, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
from .database import get_session
from sqlmodel import select
@@ -20,7 +20,7 @@ if TYPE_CHECKING:
from .task import Task
from .webdav import WebDAV
class User(BaseModel, table=True):
class User(TableBase, table=True):
__tablename__ = 'users'
email: str = Field(max_length=100, unique=True, index=True, description="用户邮箱,唯一")

View File

@@ -2,12 +2,12 @@
from typing import TYPE_CHECKING
from sqlmodel import Field, Relationship, UniqueConstraint, text, Column, func, DateTime
from .base import BaseModel
from .base import TableBase
if TYPE_CHECKING:
from .user import User
class WebDAV(BaseModel, table=True):
class WebDAV(TableBase, table=True):
__tablename__ = 'webdavs'
__table_args__ = (UniqueConstraint("name", "user_id", name="uq_webdav_name_user"),)