django中查询表数据组成树形数据返回

Django中自定义的一个表,表的字段是:id、name、parentid
想要通过某个ID查询出这个ID及以下的树形数据,并组成下面格式返回

[{
          name: '一级 1',
          id1,
          children: [{
            name: '二级 1-1', 
            id3,
            children: [{
              name: '三级 1-1-1' id5,
            }]
          }]
        }, {
          name: '一级 2', 
          id2,
          children: [{
            name: '二级 2-1', 
            id4,
            children: [{
              name: '三级 2-1-1' id6,
            }]
          }, {
            name: '二级 2-2',
            id7,
            children: [{
              name: '三级 2-2-1' id8,
            }]
          }]
  }
]

不知道怎么查询处理可以得到这个数据,想到递归或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

这是一个递归的查询函数,需要你在里面实现查询当前节点和子节点的逻辑,并将查询到的结果组装为你指定的格式。

望采纳

构造树形数据,核心思想就是利用【递归】实现。