sqlalchemy.exc.InvalidRequestError: Mapper '...' 没有属性 '...'

nve*_*ven 8 python sqlalchemy

我有两个班级,TrialIdentifierTimeCourse

TimeCourse 有一个包含 TrialIdentifier 的实例变量,我正在尝试在两者之间设置外键关系。

在 TrialIdentifier 中

__tablename__ = 'trial_identifiers'

relationships = relationship('TimeCourse', 
                             back_populates = 'trial_identifier', uselist = False)
Run Code Online (Sandbox Code Playgroud)

在时间课程

__tablename__ = 'time_course'

trial_identifier_id = Column(Integer, ForeignKey('trial_identifiers.id'))
trial_identifier = relationship('TrialIdentifier', back_populates = 'relationships')`
Run Code Online (Sandbox Code Playgroud)

如果我trial_identifierTimeCourse以下错误中命名变量,则会引发:

sqlalchemy.exc.InvalidRequestError: Mapper 'Mapper|TimeCourse|time_course' has no property 'trial_identifier'
Run Code Online (Sandbox Code Playgroud)

如果我将其命名为其他任何名称,则一切正常。整个包都建立在 上,TimeCourse().trial_identifier所以如果可能的话,我想避免重构它。或者至少理解这种行为。

nve*_*ven 8

Trial_identifier 是一个私有变量,定义为_trial_identifier

删除 setter 和 getter,或者替换

trial_identifier = relationship('TrialIdentifier', back_populates = 'relationships')`
Run Code Online (Sandbox Code Playgroud)

_trial_identifier = relationship('TrialIdentifier', back_populates = 'relationships')`
Run Code Online (Sandbox Code Playgroud)

解决了问题


Yau*_*hen 7

另外,您可以使用替代方法来解决此问题。只需使用backref而不是back_populates. 这个对我有用:

在时间课程中:

trial_identifier = relationship('TrialIdentifiers', backref = 'time_course')
Run Code Online (Sandbox Code Playgroud)

您可以在 SQLAlchemy 文档中找到更多信息