在 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