89 lines
3.1 KiB
Python
89 lines
3.1 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
基础模型模块
|
||
包含所有模型共用的字段和方法
|
||
"""
|
||
|
||
import datetime
|
||
from sqlalchemy import Column, Integer, Boolean, desc
|
||
from sqlalchemy.dialects.mysql import DATETIME
|
||
from config.database_config import Base
|
||
|
||
class BaseModel(Base):
|
||
"""
|
||
基础模型类
|
||
包含所有模型共用的字段和方法
|
||
"""
|
||
__abstract__ = True # 声明为抽象类,不会创建表
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True, comment='主键ID')
|
||
created_at = Column(DATETIME(fsp=6), default=datetime.datetime.now, comment='创建时间')
|
||
updated_at = Column(DATETIME(fsp=6), default=datetime.datetime.now, onupdate=datetime.datetime.now, comment='更新时间')
|
||
is_deleted = Column(Boolean, default=False, comment='是否删除(软删除标记)')
|
||
|
||
def to_dict(self):
|
||
"""
|
||
将模型转换为字典
|
||
用于API响应
|
||
"""
|
||
result = {}
|
||
for column in self.__table__.columns:
|
||
value = getattr(self, column.name)
|
||
# 处理日期时间类型
|
||
if isinstance(value, datetime.datetime):
|
||
value = value.strftime('%Y-%m-%d %H:%M:%S')
|
||
result[column.name] = value
|
||
return result
|
||
|
||
def to_json(self, fields=None, exclude=None, timestamp_format='ms'):
|
||
"""
|
||
将模型转换为JSON友好的字典
|
||
|
||
Args:
|
||
fields (list, optional): 需要包含的字段列表,为None则包含所有字段
|
||
exclude (list, optional): 需要排除的字段列表
|
||
timestamp_format (str, optional): 时间戳格式,可选值:'ms'(毫秒时间戳), 'iso'(ISO格式), 'str'(字符串格式)
|
||
|
||
Returns:
|
||
dict: 包含指定字段的字典
|
||
"""
|
||
result = {}
|
||
|
||
# 获取所有列名
|
||
columns = [column.name for column in self.__table__.columns]
|
||
|
||
# 如果指定了fields,则只包含这些字段
|
||
if fields:
|
||
columns = [col for col in columns if col in fields]
|
||
|
||
# 排除指定的字段
|
||
if exclude:
|
||
columns = [col for col in columns if col not in exclude]
|
||
|
||
# 获取字段值
|
||
for column in columns:
|
||
value = getattr(self, column)
|
||
|
||
# 处理日期时间类型
|
||
if isinstance(value, datetime.datetime):
|
||
if timestamp_format == 'ms':
|
||
# 转换为毫秒时间戳
|
||
value = int(value.timestamp() * 1000)
|
||
elif timestamp_format == 'iso':
|
||
# 转换为ISO格式
|
||
value = value.isoformat()
|
||
else:
|
||
# 转换为字符串格式
|
||
value = value.strftime('%Y-%m-%d %H:%M:%S')
|
||
|
||
# 处理枚举类型
|
||
elif hasattr(value, 'name') and hasattr(value, 'value'):
|
||
# 如果是枚举类型,返回其值
|
||
value = value.value
|
||
|
||
result[column] = value
|
||
|
||
return result
|