在 Flask-Sqlalchemy 中为外键关系自引用 table
Self-referencing a table for a foreign key relationship in Flask-Sqlalchemy
我确信这个问题有一个简单的解决方案,但我一直无法找到或想到它。我有一个模型“条目”,它们应该按顺序排列(例如,条目 1 可能是博客的第一部分 post,条目 2 可能是第二部分,依此类推)
class Entry(db.Model):
__tablename__="entry"
id = db.Column(db.Integer, primary_key=True)
...
prev_entry_id = db.Column(db.Integer, db.ForeignKey('entry.id'))
next_entry_id = db.Column(db.Integer, db.ForeignKey('entry.id'))
prev_entry = db.relationship("Entry", backref='next', remote_side='entry.id', foreign_keys=[prev_entry_id]) #previous_entry object
next_entry = db.relationship("Entry", backref="previous", uselist=False, foreign_keys=[next_entry_id]) #next_entry object
这个想法是,如果你得到一个条目,比如条目 56,你可以向前导航 (57) 和向后导航 (55),一步一步,一直到最后,就好像它是一个指针。
但是我从 sqlalchemy 中收到大量错误:
Table has no attribute 'id'
如果我注释掉“prev_entry”,我得到:
sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class Entry->entry'. Original exception was: 'Table' object has no attribute 'id'
如果我注释掉两个“next_*entry”我得到:Table has no attribute 'id'
如果我同时注释掉“next_entry”* 和“prev_entry”,它至少会加载。
简而言之,有谁知道在 Flask-SqlAlchemy 中设置它的正确方法吗?
出现“无属性 ID”错误是因为 SQLAlchemy 将 'entry.id'
解释为引用基础 Table
对象,而不是模型。使用 'Entry.id'
(模型参考)或 'entry.c.id'
(table 参考)修复此问题。
此外,使用back_populates
而不是backref
来配置反向关系:
prev_entry = db.relationship(
'Entry',
back_populates='next_entry',
remote_side='Entry.id',
foreign_keys=[prev_entry_id],
) # previous_entry object
next_entry = db.relationship(
'Entry',
back_populates='prev_entry',
uselist=False,
foreign_keys=[next_entry_id],
) # next_entry object
我确信这个问题有一个简单的解决方案,但我一直无法找到或想到它。我有一个模型“条目”,它们应该按顺序排列(例如,条目 1 可能是博客的第一部分 post,条目 2 可能是第二部分,依此类推)
class Entry(db.Model):
__tablename__="entry"
id = db.Column(db.Integer, primary_key=True)
...
prev_entry_id = db.Column(db.Integer, db.ForeignKey('entry.id'))
next_entry_id = db.Column(db.Integer, db.ForeignKey('entry.id'))
prev_entry = db.relationship("Entry", backref='next', remote_side='entry.id', foreign_keys=[prev_entry_id]) #previous_entry object
next_entry = db.relationship("Entry", backref="previous", uselist=False, foreign_keys=[next_entry_id]) #next_entry object
这个想法是,如果你得到一个条目,比如条目 56,你可以向前导航 (57) 和向后导航 (55),一步一步,一直到最后,就好像它是一个指针。
但是我从 sqlalchemy 中收到大量错误:
Table has no attribute 'id'
如果我注释掉“prev_entry”,我得到:
sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Triggering mapper: 'mapped class Entry->entry'. Original exception was: 'Table' object has no attribute 'id'
如果我注释掉两个“next_*entry”我得到:Table has no attribute 'id'
如果我同时注释掉“next_entry”* 和“prev_entry”,它至少会加载。
简而言之,有谁知道在 Flask-SqlAlchemy 中设置它的正确方法吗?
出现“无属性 ID”错误是因为 SQLAlchemy 将 'entry.id'
解释为引用基础 Table
对象,而不是模型。使用 'Entry.id'
(模型参考)或 'entry.c.id'
(table 参考)修复此问题。
此外,使用back_populates
而不是backref
来配置反向关系:
prev_entry = db.relationship(
'Entry',
back_populates='next_entry',
remote_side='Entry.id',
foreign_keys=[prev_entry_id],
) # previous_entry object
next_entry = db.relationship(
'Entry',
back_populates='prev_entry',
uselist=False,
foreign_keys=[next_entry_id],
) # next_entry object