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
相关产品推荐
相关产品推荐

