Django中自定义的一个表,表的字段是:id、name、parentid
想要通过某个ID查询出这个ID及以下的树形数据,并组成下面格式返回
[{
name: '一级 1',
id:1,
children: [{
name: '二级 1-1',
id:3,
children: [{
name: '三级 1-1-1',
id:5,
}]
}]
}, {
name: '一级 2',
id:2,
children: [{
name: '二级 2-1',
id:4,
children: [{
name: '三级 2-1-1',
id:6,
}]
}, {
name: '二级 2-2',
id:7,
children: [{
name: '三级 2-2-1',
id:8,
}]
}]
}
]
不知道怎么查询处理可以得到这个数据,想到递归或django-treebeard,但不会用,请哪位能帮忙给讲一下。
一种方法是使用递归,在查询每个节点时调用自身函数,并将父节点 ID 作为参数传入。另一种方法是使用 django-treebeard 库,该库提供了一些工具来方便地处理树形数据。
递归示例代码如下:
def get_tree_data(parent_id):
children = MyModel.objects.filter(parentid=parent_id)
data = []
for child in children:
data.append({
'name': child.name,
'id': child.id,
'children': get_tree_data(child.id)
})
return data
使用 django-treebeard 库的示例代码如下:
from treebeard.mp_tree import MP_Node
class MyModel(MP_Node):
name = models.CharField(max_length=255)
parentid = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
node_order_by = ['name']
# 获取子树
subtree = MyModel.objects.get(id=parent_id).get_descendants()
这里给出的是示例代码,实际使用中需要根据你的具体需求进行修改。
希望关注采纳
# 第一部分models,继承的是MPTTModel,这个是django-mptt的库
class FmailyMptt(MPTTModel):
# 第二部分:递归
def display(foods):
display_list = []
for food in foods:
childrens = food.get_children()
if len(childrens) > 0:
children = display(childrens)
else:
children = []
display_list.append({'title': food.surname + food.name, 'url': food.clan.clanname, 'children': children})
return display_list
# 第三部分
f_mptt = FmailyMptt.objects.filter(parent=None)
ad = display(f_mptt)
print('树图', ad)
```
望采纳!!!
我觉得你可以使用递归来实现这个功能。
首先,你需要查询出需要的所有数据,然后在 Python 中递归处理。
具体实现步骤如下:
查询出所有数据,并按 parentid 分组,得到一个字典,key 为 parentid,value 为对应的记录。
定义一个函数,用来递归处理数据。这个函数需要接收当前的 parentid 和整个数据字典。
在函数中,首先查询出 parentid 对应的记录。如果没有记录,返回空。
如果有记录,遍历记录,对于每条记录,调用函数本身,传入 id 和整个数据字典。
把当前记录的子记录添加到当前记录的 children 属性中。
返回当前记录。
这样,每次调用函数时,会返回当前 parentid 对应的记录及其所有子记录组成的树形结构。
# 将数据按 parentid 分组
data_dict = {}
for item in data:
if item.parentid not in data_dict:
data_dict[item.parentid] = []
data_dict[item.parentid].append(item)
# 递归函数
def build_tree(parentid, data_dict):
if parentid not in data_dict:
return None
records = data_dict[parentid]
result = []
for item in records:
children = build_tree(item.id, data_dict)
if children:
item.children = children
result.append(item)
return result
# 从根节点 parentid 为 0 开始递归
root = build_tree(0, data_dict)
示例代码,但是需要你提供一些额外的信息,例如数据存储的方式(数据库、文件、内存等),以及如何查询数据(是否有相应的API接口等)
def get_tree_by_id(id):
# 根据id查询当前节点的信息,这里需要你自己实现
current_node = query_node_by_id(id)
# 查询当前节点下的子节点,这里需要你自己实现
children = query_children_by_parent_id(id)
result = {
'name': current_node['name'],
'id': current_node['id']
}
if children:
result['children'] = []
for child in children:
result['children'].append(get_tree_by_id(child['id']))
return result
这是一个递归的查询函数,需要你在里面实现查询当前节点和子节点的逻辑,并将查询到的结果组装为你指定的格式。
望采纳
构造树形数据,核心思想就是利用【递归】实现。