同一表格中的Flask-AppBuilder多对多关系

时间:2020-09-08 13:02:37

标签: python sqlalchemy flask-appbuilder

我在同一张表之间有许多关系,并且想在Flask-AppBuilder中定义它们。例如,人与人之间的父子关系,其中两个实例都属于同一个表“人”。但是,当我这样做时,我得到了错误:

错误

sqlalchemy.exc.NoForeignKeysError:无法确定连接条件 关系Human.child的父/子表之间-没有 链接这些表的外键。确保引用列 与ForeignKey或ForeignKeyConstraint关联,或指定一个 “ primaryjoin”表达式。

示例模型。py

from flask_appbuilder import Model
from sqlalchemy import Column, String, ForeignKey
from sqlalchemy.orm import relationship

class HumanHasChild(Model):
    parent_id = Column(String(200), ForeignKey("Human.id"), primary_key=True)
    child_id = Column(String(200), ForeignKey("Human.id"), primary_key=True)

class Human(Model):
    id = Column(String(200), primary_key=True)
    child = relationship("HumanHasChild", foreign_keys="HumanHasChild.child_id")

与错误消息相反,我确实指定了三次外键。但是我也尝试添加一个显式联接条件:

class Human(Model):
    id = Column(String(200), primary_key=True)
    child = relationship("HumanHasChild", foreign_keys="HumanHasChild.child_id",primaryjoin="Human.id==HumanHasChild.parent_id")         

尽管如此,我仍然收到错误消息:

sqlalchemy.exc.ArgumentError:无法找到任何相关的外部文件 主要联接条件的关键列'human.id = human.has_child.parent_id上的关系。确保这件事 引用列与ForeignKey或 ForeignKeyConstraint,或在连接条件中使用 foreign()注释。

如何在同一张表中获得多对多关系来工作?

1 个答案:

答案 0 :(得分:0)

SQLAlchemy Many-to-Many Relationship on a Single Table之后,答案是:

from flask_appbuilder import Model
from sqlalchemy import Column, String, ForeignKey, Table
from sqlalchemy.orm import relationship

HumanHasChild = Table("HumanHashChild",Model.metadata,
    Column("parent_id",String(200), ForeignKey("Human.id"), primary_key=True),
    Column("child_id",String(200), ForeignKey("Human.id"), primary_key=True)                                                                                                                                                                                                                                                  
    )

class Human(Model):
    id = Column(String(200), primary_key=True)
    child = relationship("Human",
    secondary=HumanHasChild,
    foreign_keys = [HumanHasChild.c.parent_id,HumanHasChild.c.child_id],
    primaryjoin=id==HumanHasChild.c.parent_id,
    secondaryjoin=id==HumanHasChild.c.child_id,
    backref="children")