SQLAlchemy MPTT 混合(嵌套集)
项目描述
用于实现修改前序遍历的库,与 SQLAlchemy 模型一起工作,并处理模型实例的树,类似于 django-mptt。文档 http://sqlalchemy-mptt.readthedocs.io/
嵌套集模型是表示关系数据库中嵌套集(也称为树或层次结构)的一种特定技术。
安装
从 GitHub 安装
pip install git+http://github.com/uralbash/sqlalchemy_mptt.git
PyPi
pip install sqlalchemy_mptt
源代码
pip install -e .
用法
将混合添加到模型
from sqlalchemy import Column, Integer, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_mptt.mixins import BaseNestedSets
Base = declarative_base()
class Tree(Base, BaseNestedSets):
__tablename__ = "tree"
id = Column(Integer, primary_key=True)
visible = Column(Boolean)
def __repr__(self):
return "<Node (%s)>" % self.id
现在您可以添加、移动和删除对象!
插入节点
node = Tree(parent_id=6)
session.add(node)
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Insert node with parent_id == 6 1 1(1)24 _______________|_________________ | | | 2 2(2)5 6(4)13 14(7)23 | ____|____ ___|____ | | | | | 3 3(3)4 7(5)8 9(6)12 15(8)18 19(10)22 | | | 4 10(23)11 16(9)17 20(11)21
删除节点
node = session.query(Tree).filter(Tree.id == 4).one()
session.delete(node)
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Delete node == 4 1 1(1)16 _______________|_____ | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13
更新节点
node = session.query(Tree).filter(Tree.id == 8).one()
node.parent_id = 5
session.add(node)
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 - > 5 1 1(1)22 _______________|__________________ | | | 2 2(2)5 6(4)15 16(7)21 | ^ | 3 3(3)4 7(5)12 13(6)14 17(10)20 | | 4 8(8)11 18(11)19 | 5 9(9)10
移动节点(支持多树)
嵌套集多树
内部移动
node = session.query(Tree).filter(Tree.id == 4).one()
node.move_inside("15")
4 -> 15 level Nested sets tree1 1 1(1)16 _______________|_____________________ | | 2 2(2)5 6(7)15 | ^ 3 3(3)4 7(8)10 11(10)14 | | 4 8(9)9 12(11)13 level Nested sets tree2 1 1(12)28 ________________|_______________________ | | | 2 2(13)5 6(15)17 18(18)27 | ^ ^ 3 3(14)4 7(4)12 13(16)14 15(17)16 19(19)22 23(21)26 ^ | | 4 8(5)9 10(6)11 20(20)21 24(22)25
之后移动
node = session.query(Tree).filter(Tree.id == 8).one()
node.move_after("5")
level Nested sets example 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level Move 8 after 5 1 1(1)22 _______________|__________________ | | | 2 2(2)5 6(4)15 16(7)21 | ^ | 3 3(3)4 7(5)8 9(8)12 13(6)14 17(10)20 | | 4 10(9)11 18(11)19
移动到顶级
node = session.query(Tree).filter(Tree.id == 15).one()
node.move_after("1")
level tree_id = 1 1 1(1)22 _______________|___________________ | | | 2 2(2)5 6(4)11 12(7)21 | ^ ^ 3 3(3)4 7(5)8 9(6)10 13(8)16 17(10)20 | | 4 14(9)15 18(11)19 level tree_id = 2 1 1(15)6 ^ 2 2(16)3 4(17)5 level tree_id = 3 1 1(12)16 _______________| | | 2 2(13)5 6(18)15 | ^ 3 3(14)4 7(19)10 11(21)14 | | 4 8(20)9 12(22)13
支持和开发
要报告错误,请使用问题跟踪器。
我们欢迎任何贡献:建议、想法、带有新功能的提交、错误修复、重构、文档、测试、翻译等...
如果您有疑问,请联系我sacrud@uralbash.ru或#sacrud IRC频道
许可证
该项目遵循MIT许可协议。
0.2.5 (2019-07-23)
参阅问题 #64
添加了类似的 django_mptt 方法 get_siblings 和 get_children
0.2.4 (2018-12-14)
参阅PR #61
允许指定path_to_root的排序
0.2.3 (2018-06-03)
参阅问题 #57
修复重建树的问题
添加了对节点标识符从0开始的支撑
0.2.2 (2017-10-05)
参阅问题 #56
添加了自定义默认根级别。支持Django风格的level=0
0.2.1 (2016-01-23)
参阅PR #51
修复索引列名称问题
0.2.0 (2015-11-13)
参阅PR #50
将 parent_id 改为动态匹配主键的类型
将drilldown_tree的逻辑和path_to_root的逻辑作为实例和类级别方法公开