You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy自定义__repr__方法显示不一致问题求助

解决SQLAlchemy模型__repr__显示关联属性的问题

问题根源在于:当你访问nodes这类关联属性后,SQLAlchemy会将加载的关联对象存入实例的__dict__中,而你当前的__repr__方法仅排除了_sa_instance_state,未过滤掉关联属性的键。

要让__repr__始终只显示模型自身的数据库列属性,可以利用SQLAlchemy模型的__mapper__属性获取所有列的键名,仅保留这些键对应的属性:

修改Base类的__repr__方法如下:

class Base(DeclarativeBase):
    def __repr__(self):
        cls = self.__class__
        name = cls.__name__
        # 获取当前模型所有数据库列的键名
        column_keys = cls.__mapper__.columns.keys()
        # 仅保留列属性对应的键值对
        attr_dict = {k: v for k, v in self.__dict__.items() if k in column_keys}
        return f'{name}: {attr_dict}'

这样修改后,无论是否访问关联属性,__repr__都会只输出模型自身的列属性(如id、name等),不会包含nodes这类关联属性。

完整的实体类代码示例:

import sqlalchemy as sa
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship, Session
from typing import List

class Base(DeclarativeBase):
    def __repr__(self):
        cls = self.__class__
        name = cls.__name__
        column_keys = cls.__mapper__.columns.keys()
        attr_dict = {k: v for k, v in self.__dict__.items() if k in column_keys}
        return f'{name}: {attr_dict}'

class DBNetwork(Base):
    __tablename__ = 'networks'
    id: Mapped[int] = mapped_column(sa.Integer, primary_key=True)
    name: Mapped[str] = mapped_column(sa.String(60))
    # 其他列...
    nodes: Mapped[List['DBNode']] = relationship(back_populates='network')

class DBNode(Base):
    __tablename__ = 'nodes'
    id: Mapped[int] = mapped_column(sa.Integer, primary_key=True)
    network_id: Mapped[int] = mapped_column(sa.Integer, sa.ForeignKey('simulation.networks.id'))
    name: Mapped[str] = mapped_column(sa.String(25))  # 修正原代码类型错误:String对应str而非int
    # 其他列...
    network: Mapped['DBNetwork'] = relationship(back_populates='nodes')

内容的提问来源于stack exchange,提问作者oakca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:16:13