|
1 | 1 | [](https://travis-ci.org/ITCase/sqlalchemy_mptt) |
2 | 2 | [](https://coveralls.io/r/ITCase/sqlalchemy_mptt) |
3 | | -[](https://waffle.io/itcase/sqlalchemy_mptt) |
| 3 | +[](https://waffle.io/itcase/sqlalchemy_mptt) |
4 | 4 |
|
5 | 5 | Library for implementing Modified Preorder Tree Traversal with your SQLAlchemy Models and working with trees of Model instances, like django-mptt. |
6 | 6 |
|
7 | | - |
| 7 | + |
8 | 8 |
|
9 | 9 | The nested set model is a particular technique for representing nested sets (also known as trees or hierarchies) in relational databases. |
10 | 10 |
|
11 | | - |
12 | | - |
13 | 11 | Installing |
14 | 12 | ---------- |
15 | 13 |
|
@@ -51,3 +49,178 @@ class Tree(Base, BaseNestedSets): |
51 | 49 | Tree.register_tree() |
52 | 50 | ``` |
53 | 51 | Now you can add, move and delete obj |
| 52 | + |
| 53 | +Insert node |
| 54 | +----------- |
| 55 | + |
| 56 | +```python |
| 57 | +node = Tree(parent_id=6) |
| 58 | +session.add(node) |
| 59 | +``` |
| 60 | + |
| 61 | + level Nested sets example |
| 62 | + 1 1(1)22 |
| 63 | + _______________|___________________ |
| 64 | + | | | |
| 65 | + 2 2(2)5 6(4)11 12(7)21 |
| 66 | + | ^ ^ |
| 67 | + 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 |
| 68 | + | | |
| 69 | + 4 14(9)15 18(11)19 |
| 70 | + |
| 71 | + level Insert node with parent_id == 6 |
| 72 | + 1 1(1)24 |
| 73 | + _______________|_________________ |
| 74 | + | | | |
| 75 | + 2 2(2)5 6(4)13 14(7)23 |
| 76 | + | ____|____ ___|____ |
| 77 | + | | | | | |
| 78 | + 3 3(3)4 7(5)8 9(6)12 15(8)18 19(10)22 |
| 79 | + | | | |
| 80 | + 4 10(23)11 16(9)17 20(11)21 |
| 81 | + |
| 82 | +Delete node |
| 83 | +----------- |
| 84 | + |
| 85 | +```python |
| 86 | +node = session.query(Tree).filter(Tree.id == 4).one() |
| 87 | +session.delete(node) |
| 88 | +``` |
| 89 | + |
| 90 | + level Nested sets example |
| 91 | + 1 1(1)22 |
| 92 | + _______________|___________________ |
| 93 | + | | | |
| 94 | + 2 2(2)5 6(4)11 12(7)21 |
| 95 | + | ^ ^ |
| 96 | + 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 |
| 97 | + | | |
| 98 | + 4 14(9)15 18(11)19 |
| 99 | + |
| 100 | + level Delete node == 4 |
| 101 | + 1 1(1)16 |
| 102 | + _______________|_____ |
| 103 | + | | |
| 104 | + 2 2(2)5 6(7)15 |
| 105 | + | ^ |
| 106 | + 3 3(3)4 7(8)10 11(10)14 |
| 107 | + | | |
| 108 | + 4 8(9)9 12(11)13 |
| 109 | + |
| 110 | +Update node |
| 111 | +----------- |
| 112 | + |
| 113 | +```python |
| 114 | +node = session.query(Tree).filter(Tree.id == 8).one() |
| 115 | +node.parent_id = 5 |
| 116 | +session.add(node) |
| 117 | +``` |
| 118 | + |
| 119 | + level Nested sets example |
| 120 | + 1 1(1)22 |
| 121 | + _______________|___________________ |
| 122 | + | | | |
| 123 | + 2 2(2)5 6(4)11 12(7)21 |
| 124 | + | ^ ^ |
| 125 | + 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 |
| 126 | + | | |
| 127 | + 4 14(9)15 18(11)19 |
| 128 | + |
| 129 | + level Move 8 - > 5 |
| 130 | + 1 1(1)22 |
| 131 | + _______________|__________________ |
| 132 | + | | | |
| 133 | + 2 2(2)5 6(4)15 16(7)21 |
| 134 | + | ^ | |
| 135 | + 3 3(3)4 7(5)12 13(6)14 17(10)20 |
| 136 | + | | |
| 137 | + 4 8(8)11 18(11)19 |
| 138 | + | |
| 139 | + 5 9(9)10 |
| 140 | + |
| 141 | +Move node (support multitree) |
| 142 | +----------------------------- |
| 143 | + |
| 144 | + |
| 145 | + |
| 146 | +```python |
| 147 | +node = session.query(Tree).filter(Tree.id == 4).one() |
| 148 | +node.move_inside("15") |
| 149 | +``` |
| 150 | + 4 -> 15 |
| 151 | + level Nested sets tree1 |
| 152 | + 1 1(1)16 |
| 153 | + _______________|_____________________ |
| 154 | + | | |
| 155 | + 2 2(2)5 6(7)15 |
| 156 | + | ^ |
| 157 | + 3 3(3)4 7(8)10 11(10)14 |
| 158 | + | | |
| 159 | + 4 8(9)9 12(11)13 |
| 160 | + |
| 161 | + level Nested sets tree2 |
| 162 | + 1 1(12)28 |
| 163 | + ________________|_______________________ |
| 164 | + | | | |
| 165 | + 2 2(13)5 6(15)17 18(18)27 |
| 166 | + | ^ ^ |
| 167 | + 3 3(14)4 7(4)12 13(16)14 15(17)16 19(19)22 23(21)26 |
| 168 | + ^ | | |
| 169 | + 4 8(5)9 10(6)11 20(20)21 24(22)25 |
| 170 | + |
| 171 | +```python |
| 172 | +node = session.query(Tree).filter(Tree.id == 8).one() |
| 173 | +node.move_after("5") |
| 174 | +``` |
| 175 | + |
| 176 | + level Nested sets example |
| 177 | + 1 1(1)22 |
| 178 | + _______________|___________________ |
| 179 | + | | | |
| 180 | + 2 2(2)5 6(4)11 12(7)21 |
| 181 | + | ^ ^ |
| 182 | + 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 |
| 183 | + | | |
| 184 | + 4 14(9)15 18(11)19 |
| 185 | + |
| 186 | + level Move 8 after 5 |
| 187 | + 1 1(1)22 |
| 188 | + _______________|__________________ |
| 189 | + | | | |
| 190 | + 2 2(2)5 6(4)15 16(7)21 |
| 191 | + | ^ | |
| 192 | + 3 3(3)4 7(5)8 9(8)12 13(6)14 17(10)20 |
| 193 | + | | |
| 194 | + 4 10(9)11 18(11)19 |
| 195 | + |
| 196 | +Move to top level |
| 197 | + |
| 198 | +```python |
| 199 | +node = session.query(Tree).filter(Tree.id == 15).one() |
| 200 | +node.move_after("1") |
| 201 | +``` |
| 202 | + |
| 203 | + level tree_id = 1 |
| 204 | + 1 1(1)22 |
| 205 | + _______________|___________________ |
| 206 | + | | | |
| 207 | + 2 2(2)5 6(4)11 12(7)21 |
| 208 | + | ^ ^ |
| 209 | + 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 |
| 210 | + | | |
| 211 | + 4 14(9)15 18(11)19 |
| 212 | + |
| 213 | + level tree_id = 2 |
| 214 | + 1 1(15)6 |
| 215 | + ^ |
| 216 | + 2 2(16)3 4(17)5 |
| 217 | + |
| 218 | + level tree_id = 3 |
| 219 | + 1 1(12)16 |
| 220 | + _______________| |
| 221 | + | | |
| 222 | + 2 2(13)5 6(18)15 |
| 223 | + | ^ |
| 224 | + 3 3(14)4 7(19)10 11(21)14 |
| 225 | + | | |
| 226 | + 4 8(20)9 12(22)13 |
0 commit comments