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

あなたがしていることは、自己参照型の多対多ではなく、自己参照型の 1 対多 (1 つの親が多くの子を持つ) です。

まず、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 に答える