1

以下に示すように、クラスがNodeあります。正常に動作しますが、定義をクラスLeaf (Node)にシフトしたいと思います。どうすればそれを達成できますか?leafssubleafsLeaf (Node)

class Node (db.Model):
    __mapper_args__ = {'polymorphic_identity':'node', 'polymorphic_on':'type'}
    id = db.Column (db.Integer, primary_key=True)
    type = db.Column ('type', db.String (16))

    root_id = db.Column (db.Integer, db.ForeignKey (id))
    nodes = db.relationship ('Node',
        cascade='all', lazy='dynamic',
        primaryjoin='Node.root_id==Node.id',
        backref=db.backref('root', remote_side=id))
    leafs = db.relationship ('Leaf',
        cascade='all', lazy='dynamic',
        primaryjoin='Leaf.root_id==Node.id')

    base_id = db.Column (db.Integer, db.ForeignKey (id))
    subnodes = db.relationship ('Node',
        cascade='all', lazy='dynamic',
        primaryjoin='Node.base_id==Node.id',
        backref=db.backref('base', remote_side=id))
    subleafs = db.relationship ('Leaf',
        cascade='all', lazy='dynamic',
        primaryjoin='Leaf.base_id==Node.id')

    def __init__ (self, root):
        self.base = root.base if root and root.base else root
        self.root = root

class Leaf (Node):
    __mapper_args__ = {'polymorphic_identity': 'leaf'}
    leaf_id = db.Column (db.Integer, db.ForeignKey ('node.id'), primary_key=True)

    def __init__ (self, root):
        super (Leaf, self).__init__ (root)

私はこれを試しましたが、失敗しました(部分的に):

class Leaf (Node):
    __mapper_args__ = {'polymorphic_identity': 'leaf'}
    leaf_id = db.Column (db.Integer, db.ForeignKey ('node.id'), primary_key=True)

    _x = db.relationship ('Node', backref=db.backref ('leafs',
        cascade='all', lazy='dynamic', primaryjoin='Leaf.root_id==Node.id'))
    _y = db.relationship ('Node', backref=db.backref ('subleafs',
        cascade='all', lazy='dynamic', primaryjoin='Leaf.base_id==Node.id'))

    def __init__ (self, root):
        super (Leaf, self).__init__ (root)

私の削除テストケースはこれが好きではなく(ツリーのベース/ルートノードを削除してに依存しているだけですcascade='all')、次のように不平を言いました:

CircularDependencyError: Circular dependency detected. Cycles: set([DeleteState(<Leaf at 0x22789d0>)]) all edges: set([(DeleteState(<Leaf at 0x22789d0>), DeleteState(<Leaf at 0x22789d0>))])

定義を変更したい理由は、のNodeすべてのサブクラスの定義で拡張したくないためです。これはLeaf (Node)、後で紹介する可能性があります。さらに、私は間違いなく and を必要とし_xません。しかし、それらを省略すると( & )、次のような問題が発生します。_yLeaf.rootLeaf.baseNode_x =_y =

AttributeError: 'Node' object has no attribute 'leafs'

とinの元の定義では後方参照を使用する必要はありませんでしたが、リレーションを接続するためにinを使用する必要があると思います。どうも。Leaf (Node)leafssubleafsNode

4

1 に答える 1

1

まあ、いくつか試した後、私は解決策を見つけましたが、それは完璧ではありませんが、仕事をしています. と の定義を が定義されているファイルに移動し、Node.leafs以下Node.subleafsleaf.pyようclass Leaf (node)に以前の定義を追加しました:

class Leaf (Node):
    __mapper_args__ = {'polymorphic_identity': 'leaf'}
    leaf_id = db.Column (db.Integer, db.ForeignKey ('node.id'), primary_key=True)

    def __init__ (self, root):
        super (Leaf, self).__init__ (root)

Node.leafs = db.relationship (Leaf, cascade='all', lazy='dynamic',
    primaryjoin=Node.id==Leaf.root_id)

Node.subleafs = db.relationship (Leaf, cascade='all', lazy='dynamic',
    primaryjoin=Node.id==Leaf.base_id)

これの欠点は、andfrom models import Leafにアクセスしたい場合にそうしなければならないことですが、( andが 内で backref として定義されていたとしても) とにかくこれをしなければならなかったので、問題ありません。Node.leafsNode.subleafsNode.leafsNode.subleafsclass Leaf (Node)

関係が 内の backref として定義されている解決策を誰かが見つけた場合は、class Leaf (Node)喜んでお知らせします。どうも。

于 2012-11-27T17:56:23.143 に答える