| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- """基础模型类"""
- 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()
|