我正在使用反射来生成两个类。一个表示消息,并且具有2个外键,用于保存发送/接收实体的表(它们可以是公司或人员)。
考虑到两个外键,我想创建相应的关系,这听起来应该很容易,但我无法让它工作。
我的代码如下所示:
class Entity(db.Model):
__tablename__ = 'Entity'
__table_args__ = {
'autoload': True,
'schema': 'msg',
'autoload_with': db.engine
}
class FileData(db.Model):
__tablename__ = 'FileData'
__table_args__ = {
'autoload': True,
'schema': 'msg',
'autoload_with': db.engine
}
sender = db.relationship('Entity', foreign_keys='SenderId')
receiver = db.relationship('Entity', foreign_keys='ReceiverId')
它失败并显示以下消息:
InvalidRequestError: When initializing mapper Mapper|FileData|FileData, expression
'SenderId' failed to locate a name ("name 'SenderId' is not defined"). If this is a
class name, consider adding this relationship() to the <class '__main__.FileData'>
class after both dependent classes have been defined.
我不知道该怎么做,因为'SenderId'绝对是桌面上的一个列,我在代码的其他部分访问它没有问题。
答案 0 :(得分:1)
如果将关系添加到定义之外,它确实有效。看起来这允许它首先运行反射,然后查看SenderId和ReceiverId列。像这样:
class Entity(db.Model):
__tablename__ = 'Entity'
__table_args__ = {
'autoload': True,
'schema': 'msg',
'autoload_with': db.engine
}
class FileData(db.Model):
__tablename__ = 'FileData'
__table_args__ = {
'autoload': True,
'schema': 'msg',
'autoload_with': db.engine
}
FileData.sender = db.relationship('Entity', foreign_keys=FileData.SenderId)
FileData.receiver = db.relationship('Entity', foreign_keys=FileData.ReceiverId)