64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
"""基础模型类"""
|
|
from datetime import datetime
|
|
from typing import Optional, Any
|
|
from sqlalchemy import Column, String, DateTime, Integer, func
|
|
from sqlalchemy.ext.declarative import declared_attr
|
|
|
|
from app.core.database import Base
|
|
|
|
|
|
class BaseModel(Base):
|
|
"""所有模型的基类,包含通用字段"""
|
|
__abstract__ = True
|
|
|
|
@declared_attr
|
|
def __tablename__(cls) -> str:
|
|
"""自动生成表名"""
|
|
import re
|
|
name = cls.__name__
|
|
# 驼峰转下划线
|
|
return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
|
|
|
|
id = Column(String(32), primary_key=True, comment="主键ID")
|
|
create_at = Column(DateTime, default=datetime.now, comment="创建时间")
|
|
create_by = Column(String(32), nullable=True, comment="创建人ID")
|
|
create_name = Column(String(100), nullable=True, comment="创建人姓名")
|
|
update_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="修改时间")
|
|
update_by = Column(String(32), nullable=True, comment="修改人ID")
|
|
|
|
def to_dict(self, exclude: list = None) -> dict:
|
|
"""转换为字典"""
|
|
if exclude is None:
|
|
exclude = []
|
|
result = {}
|
|
for column in self.__table__.columns:
|
|
if column.name not in exclude:
|
|
value = getattr(self, column.name)
|
|
if isinstance(value, datetime):
|
|
result[column.name] = value.strftime("%Y-%m-%d %H:%M:%S")
|
|
else:
|
|
result[column.name] = value
|
|
return result
|
|
|
|
|
|
class SoftDeleteModel(BaseModel):
|
|
"""支持软删除的模型基类"""
|
|
__abstract__ = True
|
|
|
|
is_del = Column(Integer, default=0, comment="是否删除: 0-否, 1-是")
|
|
|
|
@classmethod
|
|
def get_active(cls, db, **kwargs):
|
|
"""获取未删除的记录"""
|
|
return db.query(cls).filter(cls.is_del == 0, **kwargs)
|
|
|
|
def soft_delete(self, db):
|
|
"""软删除"""
|
|
self.is_del = 1
|
|
db.commit()
|
|
|
|
def restore(self, db):
|
|
"""恢复删除"""
|
|
self.is_del = 0
|
|
db.commit()
|