base.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """基础模型类"""
  2. from datetime import datetime
  3. from typing import Optional, Any
  4. from sqlalchemy import Column, String, DateTime, Integer, func
  5. from sqlalchemy.ext.declarative import declared_attr
  6. from app.core.database import Base
  7. class BaseModel(Base):
  8. """所有模型的基类,包含通用字段"""
  9. __abstract__ = True
  10. @declared_attr
  11. def __tablename__(cls) -> str:
  12. """自动生成表名"""
  13. import re
  14. name = cls.__name__
  15. # 驼峰转下划线
  16. return re.sub(r'(?<!^)(?=[A-Z])', '_', name).lower()
  17. id = Column(String(32), primary_key=True, comment="主键ID")
  18. create_at = Column(DateTime, default=datetime.now, comment="创建时间")
  19. create_by = Column(String(32), nullable=True, comment="创建人ID")
  20. create_name = Column(String(100), nullable=True, comment="创建人姓名")
  21. update_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment="修改时间")
  22. update_by = Column(String(32), nullable=True, comment="修改人ID")
  23. def to_dict(self, exclude: list = None) -> dict:
  24. """转换为字典"""
  25. if exclude is None:
  26. exclude = []
  27. result = {}
  28. for column in self.__table__.columns:
  29. if column.name not in exclude:
  30. value = getattr(self, column.name)
  31. if isinstance(value, datetime):
  32. result[column.name] = value.strftime("%Y-%m-%d %H:%M:%S")
  33. else:
  34. result[column.name] = value
  35. return result
  36. class SoftDeleteModel(BaseModel):
  37. """支持软删除的模型基类"""
  38. __abstract__ = True
  39. is_del = Column(Integer, default=0, comment="是否删除: 0-否, 1-是")
  40. @classmethod
  41. def get_active(cls, db, **kwargs):
  42. """获取未删除的记录"""
  43. return db.query(cls).filter(cls.is_del == 0, **kwargs)
  44. def soft_delete(self, db):
  45. """软删除"""
  46. self.is_del = 1
  47. db.commit()
  48. def restore(self, db):
  49. """恢复删除"""
  50. self.is_del = 0
  51. db.commit()