Files
FastapiAdmin/backend/app/core/base_model.py
T
zhangtao 8cb93d31d1 fix(core): 修正 ID 自增和操作日志请求体参数处理
- 修改基础模型中主键ID的自增参数为 autoincrement=True,确保自增行为正确
- 优化操作日志路由中请求体解析逻辑,增加 JSON 解码异常处理,提升健壮性
- 分别使用 'body' 和 'path_params' 字段存储请求体和路径参数,避免参数冲突
- 调整.env.dev配置,切换数据库类型为 PostgreSQL,更新相关连接配置项
- 清理脚本数据 JSON 文件中的冗余 id 字段,保持数据格式简洁一致
2025-09-06 14:05:55 +08:00

69 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
"""
基础模型模块
提供跨数据库兼容的基础模型类和类型装饰器
"""
import uuid
from datetime import datetime
from typing import Optional, Dict, Any
import json
from sqlalchemy import Boolean, String, Integer, DateTime, ForeignKey, Text, BigInteger
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.asyncio import AsyncAttrs
from sqlalchemy.orm import relationship, DeclarativeBase, Mapped, declared_attr, mapped_column
from sqlalchemy.types import TypeDecorator
class MappedBase(AsyncAttrs, DeclarativeBase):
"""
声明式基类
兼容 SQLite、MySQL 和 PostgreSQL
"""
__abstract__ = True
@declared_attr.directive
def __tablename__(cls) -> str:
"""生成表名"""
return cls.__name__.lower()
@declared_attr.directive
def __table_args__(cls) -> dict:
"""表配置"""
return {'comment': cls.__doc__ or ''}
class ModelMixin(MappedBase):
"""
基础模型混合类
"""
__abstract__ = True
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True, comment='主键ID')
status: Mapped[bool] = mapped_column(Boolean(), default=True, nullable=False, comment="是否启用(True:启用 False:禁用)")
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True, comment="备注说明")
created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, comment='创建时间')
updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
class CreatorMixin(ModelMixin):
"""
创建人混合类
"""
__abstract__ = True
creator_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, index=True, comment="创建人ID")
@declared_attr
def creator(cls) -> Mapped[Optional["UserModel"]]:
"""创建人关联关系(延迟加载,避免循环依赖)"""
return relationship(
"UserModel",
primaryjoin=f"{cls.__name__}.creator_id == UserModel.id",
lazy="selectin",
foreign_keys=[cls.creator_id],
viewonly=True
)