我确信这个问题有一个简单的解决方案,但我一直没能找到或思考它;条目";它们应该是按顺序排列的(例如,条目1可能是博客文章的第一部分,条目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_*条目";我得到:Table has no attribute 'id'
如果我把这两个";next_entry"*以及";prev_entry";它至少加载。
简而言之,有人知道在Flask SqlAlchemy中设置这个的正确方法吗?
;没有属性id";发生错误的原因是SQLAlchemy将'entry.id'
解释为引用底层Table
对象,而不是模型。使用'Entry.id'
(模型参考(或'entry.c.id'
(表参考(解决此问题。
此外,使用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