[英]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.