簡體   English   中英

Flask-AppBuilder 同一個表中的多對多關系

[英]Flask-AppBuilder Many-to-Many relationship within the same Table

我在同一個表之間有很多關系,並希望在 Flask-AppBuilder 中定義它們。 例如,人類之間的父子關系,其中兩個實例都屬於同一個表“Human”。 但是,當我這樣做時,我收到錯誤消息:

錯誤

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.child 上找到主要連接條件“human.id = human_has_child.parent_id”的任何相關外鍵列。 確保引用列與 ForeignKey 或 ForeignKeyConstraint 關聯,或者在連接條件中使用 foreign() 注釋進行注釋。

如何在同一個表中建立多對多關系?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM