Files
shanxia2.0/backend/app/models/base.py
T
2026-05-12 16:35:07 +08:00

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()