以下に示すように、クラスがNode
あります。正常に動作しますが、定義をクラスLeaf (Node)
にシフトしたいと思います。どうすればそれを達成できますか?leafs
subleafs
Leaf (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
ません。しかし、それらを省略すると( & )、次のような問題が発生します。_y
Leaf.root
Leaf.base
Node
_x =
_y =
AttributeError: 'Node' object has no attribute 'leafs'
とinの元の定義では後方参照を使用する必要はありませんでしたが、リレーションを接続するためにinを使用する必要があると思います。どうも。Leaf (Node)
leafs
subleafs
Node