2025-04-30 16:57:46 +08:00

89 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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