2

我正在尝试在 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”属性,我在确定问题是“基本”问题时设置了该属性。但是,我仍然希望所有兄弟姐妹都能够相互访问。

目前,我正在给“父母”问题与其所有“孩子”/“兄弟姐妹”建立关系。

当我与“兄弟”的实例交互时会出现问题。我想直接访问它的所有亲戚,但我必须先通过父母。

任何帮助将不胜感激!

编辑:基本上,我想创建一个自我引用的多对多关系。我认为这是正确的追求方向是错误的吗?

4

2 回答 2

3

您正在做的不是自我引用的多对多,而是自我引用的一对多(一个父母有很多孩子)。

首先,您不需要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()
于 2013-09-03T18:04:05.547 回答
2

我知道这是旧的,但操作也可以只使用自引用关系方案来轻松找到孩子。这是在您的团队中的工作方式。

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

呼叫孩子会将父母的所有孩子发送给您。调用 parent 将为您提供当前组的父级。如果它返回 None 那么你正在查看一个根本问题。

于 2017-11-14T18:28:20.607 回答