Files
DjangoAdmin_FastAPI_EleVue/shared/base_model.py
T
ClaudeandClaude ae2e141713 refactor(repo): 收敛 base_model 双轨,删除函数统一走 repo.batch_delete_r
- shared/base_repository.py 新增 batch_delete_r(返回 R,等价原 base_model 语义)
- 20 个模块删除函数从 Model.batch_delete_r 改为 x_repo.batch_delete_r
- shared/base_model.py 移除 classmethod(get_by_id/get_by_ids/get_all_active/exists/batch_delete_r),只留字段 + to_dict
- 清理 base_model 多余 imports
- 实测 dept 删除、批量删除及多模块读接口正常

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-07 11:28:25 +08:00

74 lines
3.0 KiB
Python

# +======================================================================
# | DjangoAdmin 企业数字化开发平台 [ 赋能开发者,助力企业发展 ]
# +----------------------------------------------------------------------
# | Copyright (c) 2021-2026 一米阳光团队 版权所有
# | 开源协议: Apache-2.0
# +======================================================================
# 由 apps/models/base_model.py 迁移而来。
"""数据库模型基类:通用字段与序列化方法(数据访问统一走 Repository)。"""
from datetime import date, datetime, timezone
from typing import Dict, Any
from sqlalchemy import Column, Integer, DATETIME
from core.database import Base
from shared.constants import SERIALIZE_EXCLUDE_FIELDS
_UTC_NOW = lambda: datetime.now(tz=timezone.utc)
class base_model(Base):
"""
数据库模型基类
所有业务模型应继承此类,自动获得通用字段和公共方法。
提供的功能:
1. 通用字段:id、创建人、创建时间、更新人、更新时间、软删除标识
2. 序列化方法:to_dict()
3. 查询方法:get_by_id()、get_by_ids()、get_all_active()、exists()
4. 删除方法:batch_delete_r()
"""
__abstract__ = True
# ============================================================
# 通用字段定义
# ============================================================
id = Column(Integer, primary_key=True, autoincrement=True, comment="主键ID")
create_user = Column(Integer, default=0, comment="创建人")
create_time = Column(DATETIME, default=_UTC_NOW, comment="创建时间")
update_user = Column(Integer, default=0, comment="更新人")
update_time = Column(DATETIME, default=_UTC_NOW, onupdate=_UTC_NOW, comment="更新时间")
is_delete = Column(Integer, default=0, comment="删除标识:0-正常 1-已删除")
# ============================================================
# 序列化方法
# ============================================================
def to_dict(self) -> Dict[str, Any]:
"""
将模型实例转换为字典
自动排除敏感字段(is_delete、password、salt)。
datetime 类型格式化为字符串,UTC 时间转为本地时间便于前端展示。
"""
result = {}
for column in self.__table__.columns:
if column.name in SERIALIZE_EXCLUDE_FIELDS:
continue
value = getattr(self, column.name)
if isinstance(value, datetime):
if value.tzinfo is not None:
# UTC 时间转为本地时间
value = value.astimezone()
value = value.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(value, date):
# 纯日期类型(如生日)无时分秒,单独格式化,避免 JSON 序列化失败
value = value.strftime('%Y-%m-%d')
result[column.name] = value
return result