簡體   English   中英

SQLAlchemy中的自引用關系

[英]Self Referential Relationship in SQLAlchemy

我試圖在SQLAlchemy中創建自引用關系。

我有一個類'問題'可能有相同的'問題'兄弟姐妹完全相同但具有不同的封面圖像屬性。

我希望每個模型都包含一個包含其兄弟姐妹列表的屬性,但如果可能的話,不包含其本身。

我的問題模型目前看起來像這樣:

class Issue(db.Model):
    __tablename__ = 'issues'
    # IDs
    id = db.Column(db.Integer, primary_key=True)
    title_id = db.Column(db.Integer, db.ForeignKey('titles.id'))
    publisher_id = db.Column(db.Integer, db.ForeignKey('publishers.id'))
    parent_id = db.Column(db.Integer, db.ForeignKey('issues.id'))
    # Attributes
    product_id = db.Column(db.String(100))
    issue_number = db.Column(db.Float)
    .......
    # Relationships
    is_parent = db.Column(db.Boolean(), default=False)
    alternates = db.relationship('Issue',
                backref=db.backref('parent', remote_side=[id])
            )

每個問題都有一個'is_parent'屬性,我在確定問題是“基礎”問題時設置該屬性。 但是,我仍然希望所有兄弟姐妹能夠互相訪問。

目前,我正在向“父母”問題提供與其所有“孩子”/“兄弟姐妹”的關系。

當我與'兄弟'的實例交互時,會出現問題。 我想直接訪問它的所有親戚,但我必須首先通過父親。

任何幫助將不勝感激!

編輯:基本上,我想創建一個自我引用的多對多關系。 我是否錯誤地相信這是正確的追求方向?

你所做的不是多對多的自我指涉,而是一對一的自我指涉(一個父母有很多孩子)。

首先,您不需要具有is_parent布爾值。 您可以通過查看parent_id字段輕松確定問題是否是父項,該字段僅指向父項。 您可以將以下幫助器方法添加到您的Issue類:

def is_parent(self):
    return self.parent_id == self.id

要獲取問題的兄弟姐妹,您可以編寫一個自定義查詢,該查詢獲取具有相同parent_id所有問題,但發出查詢的問題除外:

def get_siblings(self):
    return Issue.query.filter(Issue.parent_id == self.parent_id, Issue.id != self.id).all()

我知道這是舊的,但操作也可以使用自我參照關系方案來輕松找到孩子。 以下是您在小組中的工作方式。

class Issue(db.Model):
    __tablename__ = 'issues'
    # IDs
    id = db.Column(db.Integer, primary_key=True)
    title_id = db.Column(db.Integer, db.ForeignKey('titles.id'))
    publisher_id = db.Column(db.Integer, db.ForeignKey('publishers.id'))
    parent_id = db.Column(db.Integer, db.ForeignKey('issues.id'))
    # Attributes
    product_id = db.Column(db.String(100))
    issue_number = db.Column(db.Float)
    .......
    # Relationships
    #is_parent = db.Column(db.Boolean(), default=False)
    alternates = db.relationship('Issue',
                backref=db.backref('parent', remote_side=[id])
            )
    #This is what you need to add to make the database link it self
    parent_id=db.Column(db.Integer, db.ForeignKey('issues.id'))
    children=db.relationship('Issue', backref=db.backref('parent', remote_side=[id]))

打電話給孩子會把你父母的所有孩子送給你。 調用父級將為您提供當前組的父級。 如果它返回None,那么您正在查看根問題。

暫無
暫無

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

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