summaryrefslogtreecommitdiff
path: root/examples/backref/backref_tree.py
blob: 5f17396731056ffa32743364223a6c0adf40f6a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from sqlalchemy import *

metadata = BoundMetaData('sqlite:///', echo=True)

class Tree(object):
    def __init__(self, name='', father=None):
        self.name = name
        self.father = father
    def __str__(self):
        return '<TreeNode: %s>' % self.name
    def __repr__(self):
        return self.__str__()
        
table = Table('tree', metadata,
              Column('id', Integer, primary_key=True),
              Column('name', String(64), nullable=False),
              Column('father_id', Integer, ForeignKey('tree.id'), nullable=True))
table.create()

mapper(Tree, table,
              properties={
                'childs':relation(Tree, remote_side=table.c.father_id, primaryjoin=table.c.father_id==table.c.id,  backref=backref('father', remote_side=table.c.id))},
            )

root = Tree('root')
child1 = Tree('child1', root)
child2 = Tree('child2', root)
child3 = Tree('child3', child1)

child4 = Tree('child4')
child1.childs.append(child4)

session = create_session()
session.save(root)
session.flush()

print root.childs
print child1.childs
print child2.childs
print child2.father
print child3.father