Python 在同一个表中创建多对多关系

Python 在同一个表中创建多对多关系,python,sqlalchemy,flask-appbuilder,Python,Sqlalchemy,Flask Appbuilder,我在同一个表之间有多对多关系,希望在Flask AppBuilder中定义它们。例如,人与人之间的父子关系,其中两个实例都属于同一个表“Human”。但是,当我执行此操作时,会出现以下错误: 错误 sqlalchemy.exc.NoForeignKeyError:无法确定联接条件 关系Human.child上的父/子表之间-没有 链接这些表的外键。确保引用列 与ForeignKey或ForeignKeyConstraint关联,或指定 “primaryjoin”表达式 示例models.py 与

我在同一个表之间有多对多关系,希望在Flask AppBuilder中定义它们。例如,人与人之间的父子关系,其中两个实例都属于同一个表“Human”。但是,当我执行此操作时,会出现以下错误:

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

示例models.py 与错误消息相反,我确实指定了外键三次。但是,我也尝试添加显式连接条件:

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\u在关系human.child上有\u child.parent\u id'。确保 引用列与ForeignKey或 ForeignKeyConstraint,或在连接条件中使用 foreign()注释

如何使同一个表中的多对多关系发挥作用?

下面,答案是:

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")
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")