2013-02-23 58 views
3

我有一個類RevisionRevision具有以下定義:涉及一類到它的自

class Revision(db.Model): 
    id = db.Column(db.Unicode, primary_key=True) 
    text = db.Column(db.Unicode) 

此外,每個Revision可以有一個祖先,如在另一Revision的關係。每個Revision也應該跟蹤任何接班人,即Revision s,它作爲他們的祖先。我曾嘗試兩個以下:

ancestorId = db.Column(db.Unicode, db.ForeignKey("revision.id")) 
successors = db.relationship("Revision", backref="ancestor", lazy="dynamic") 

它扔:

sqlalchemy.exc.ArgumentError: Revision.successors and back-reference Revision.ancestor are both of the same direction <symbol 'ONETOMANY>. Did you mean to set remote_side on the many-to-one side ? 

successors = db.relationship("Revision", backref="ancestor", lazy="dynamic") 

它扔:

sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship Revision.successors. Specify a 'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin' is needed as well. 

回答

4

你想要什麼叫adjacency list。 SQLAlchemy的示例目錄中有一個example。重要部分是remote_side參數backref:

ancestorId = db.Column(db.Unicode, db.ForeignKey(id)) 
successors = db.relationship("Revision", 
          backref=db.backref("ancestor", remote_side=id), 
          lazy="dynamic")