2013-09-02 4 views
0

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'는 문제는 '기본'문제가 있다고 판단 될 때 내가 설정하는 것이 속성이 있습니다. 그러나, 나는 여전히 모든 형제가 서로 접근 할 수 있기를 바랍니다.

현재 '부모'문제는 모든 '자녀'/ '형제'와 관계를 맺고 있습니다.

'형제'의 인스턴스와 상호 작용할 때 문제가 발생합니다. 나는 모든 친척들에게 직접 접근하고 싶지만 나는 부모를 먼저 가야한다.

도움이 될 것입니다.

편집 : 기본적으로, 나는 자기 참조 다 대다 관계를 만들고 싶습니다. 이것이 올바른 방향을 추구한다고 잘못 생각하고 있나?

답변

2

당신이하고있는 일은 자기 참조 다 대다가 아니라 자기 참조 일대 다 (한 부모는 많은 자식을 가짐)입니다.

우선, 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() 
0

나는 이것이 오래되었다는 것을 알고있다. 그러나 op는 자기 참조 관계형 체계를 사용하여 쉽게 아이들을 찾을 수도있다. 귀하의 그룹에서 이것이 어떻게 작동할까요?

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

자녀에게 전화하면 부모의 모든 자녀가 보내집니다. 부모에게 전화하면 현재 그룹의 부모가됩니다. 없음을 반환하면 루트 문제를보고있는 것입니다.