gpt4 book ai didi

flask - 热衷于从 sqlalchemy mptt 树中获取所有项目

转载 作者:行者123 更新时间:2023-12-02 00:34:52 26 4
gpt4 key购买 nike

我正在使用 sqlalchemy_mptt 创建树结构。我的模型定义如下:

class TreeGroup(BaseNestedSets, db.Model):
name = db.Column(db.String(400), index=True, unique=True)
note = db.Column(db.Text(), nullable=True)
items = db.relationship("Item", backref='item', lazy='dynamic')

def __init__(self, name, parent_id=None):
self.uuid = uuid4().hex
self.name = name
self.parent_id = parent_id
def __repr__(self):
return '{}'.format(self.name)

class Item(db.Model):
__tablename__ = 'items'
id = db.Column(db.Integer, primary_key=True)
category_id = db.Column(db.Integer, db.ForeignKey('tree_groups.id'))
name = db.Column(db.String(475), index=True)

插入虚拟数据:

db.session.add(TreeGroup(name="Root"))  # root node
db.session.add_all( # second level
[
TreeGroup(name="Test2", parent_id=1), # id=2
TreeGroup(name="Test3", parent_id=1), # id=3
TreeGroup(name="Test4", parent_id=1), # id=4
]
)
db.session.add_all( # third level
[
TreeGroup(name="Test5", parent_id=2), # id=5
TreeGroup(name="Test6", parent_id=2), # id=6
TreeGroup(name="Test7", parent_id=3), # id=7
TreeGroup(name="Test8", parent_id=3), # id=8
TreeGroup(name="Test9", parent_id=4), # id=9
TreeGroup(name="Test10", parent_id=4) # id=10
]
)

db.session.add_all( # fourth level
[
TreeGroup(name="Test11", parent_id=5),
TreeGroup(name="Test12", parent_id=5),
TreeGroup(name="Test13", parent_id=6),
TreeGroup(name="Test14", parent_id=7)
]
)

db.session.commit()

现在让我们关注 id=3 的节点(“Test3 节点”)。我想查看它的所有项目以及他下面的项目。 (来自子节点:Test7 节点和 Test8 节点及其子节点 (Test7) -> Test14。

我怎样才能实现这个目标?我想:- 递归- 也许有一些棘手的 sqlalchemy 加入

我还知道可以通过以下方式获得 child :

x = TreeGroup.query.filter_by(name=group_name).first()
children = x.drilldown_tree() #but will that help me?

最佳答案

你是对的 - 你可以使用drilldown_tree() +递归。这是示例:

def print_tree(group_name, tab=1):
"""
:param str group_name:
:param int tab: used just for formatting
"""
group = TreeGroup.query.filter_by(name=group_name).one_or_none() # type: TreeGroup
if not group:
return
# group found - print name and find children
print('- ' * tab + group.name)
for child_group in group.children: # type: TreeGroup
# new tabulation value for child record
print_tree(child_group.name, tab * 2)

示例:

# print_tree('Test3')
- Test3
- - Test7
- - - - Test14
- - Test8
# print_tree('Test2')
- Test2
- - Test5
- - - - Test11
- - - - Test12
- - Test6
- - - - Test13

希望这有帮助。

关于flask - 热衷于从 sqlalchemy mptt 树中获取所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51764890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com