【问题标题】:Flask-AppBuilder Many-to-Many relationship within the same TableFlask-AppBuilder 同一个表内的多对多关系
【发布时间】:2020-12-26 21:03:53
【问题描述】:

我在同一个表之间有多对多的关系,并想在 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")

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

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' 关于 Human.child 的关系。确保这件事 引用列与 ForeignKey 或 ForeignKeyConstraint,或者在连接条件中用 foreign() 注释。

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

【问题讨论】:

    标签: python sqlalchemy flask-appbuilder


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 1970-01-01
      • 2016-06-15
      • 2021-08-31
      • 2016-12-26
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      相关资源
      最近更新 更多