重构模型基类
This commit is contained in:
@@ -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"
|
||||
]
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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=错误")
|
||||
|
||||
@@ -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="文件名")
|
||||
|
||||
@@ -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"),)
|
||||
|
||||
|
||||
@@ -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格式)")
|
||||
|
||||
|
||||
@@ -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=离线")
|
||||
|
||||
@@ -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="订单号,唯一")
|
||||
|
||||
@@ -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="策略名称")
|
||||
|
||||
@@ -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="兑换码类型")
|
||||
|
||||
@@ -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="举报原因代码")
|
||||
|
||||
@@ -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="存储策略")
|
||||
@@ -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"),)
|
||||
|
||||
|
||||
@@ -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="分享密码(加密后)")
|
||||
|
||||
@@ -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="链接名称")
|
||||
|
||||
@@ -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="容量包名称")
|
||||
|
||||
@@ -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"),)
|
||||
|
||||
|
||||
@@ -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=错误")
|
||||
|
||||
@@ -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="用户邮箱,唯一")
|
||||
|
||||
@@ -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"),)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user