在Flask Sqlalchemy中为外键关系自引用表



我确信这个问题有一个简单的解决方案,但我一直没能找到或思考它;条目";它们应该是按顺序排列的(例如,条目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

最新更新