python 后台数据以层级形式传递给前台

时间:2022-05-16 09:21:13

一朋友给了这么个需求,类似分类文件夹,文件夹下面又可以创建子文件夹,子文件夹下面还能创建文件夹。

在通过前台查询的时候,后台返回的数据,要展示成层级嵌套的格式,如下面的格式。

python 后台数据以层级形式传递给前台


后台通过sql查询的的数据结构为

a=[
{"id": 1, "text": "a1", "parentId": "0"},
{"id": 2, "text": "a1-1", "parentId": "1"},
{"id": 3, "text": "a1-2", "parentId": "1"},
{"id": 4, "text": "a1-3", "parentId": "1"},
{"id": 5, "text": "a2", "parentId": "0"},
{"id": 6, "text": "a2-1", "parentId": "5"},
{"id": 7, "text": "a2-2", "parentId": "5"},
{"id": 8, "text": "a2-3", "parentId": "5"},
{"id": 9, "text": "a2-1-1", "parentId": "6"},
{"id": 10, "text": "a2-1-2", "parentId": "6"},
{"id": 10, "text": "a2-2-2", "parentId": "6"},
{"id": 11, "text": "a3", "parentId": "0"},
{"id": 12, "text": "a3-1", "parentId": "5"},
]

这样就要将这些数据做处理,让子文件夹数据嵌套在主文件夹里面,嵌套后的格式为

{'text': 'a2', 'children': [{'text': 'a2-1', 'children': [{'text': 'a2-1-1', 'id': 9, 'parentId': '6'}, {'text': 'a2-1-2', 'id': 10, 'parentId': '6'}], 'id': 6, 'parentId': '5'}, {'text': 'a2-2', 'children': [{'text': 'a2-2-2', 'id': 10, 'parentId': '6'}], 'id': 7, 'parentId': '5'}, {'text': 'a2-3', 'children': [], 'id': 8, 'parentId': '5'}], 'id': 5, 'parentId': '0'}
思路:前端控制,层级最多三级,先将三级的数据插入到二级,再将二级的写入到一级,具体代码如下(只求实现,没有注意写法格式和做优化,以后有时间再弄)
a=[
{"id": 1, "text": "a1", "parentId": "0"},
{"id": 2, "text": "a1-1", "parentId": "1"},
{"id": 3, "text": "a1-2", "parentId": "1"},
{"id": 4, "text": "a1-3", "parentId": "1"},
{"id": 5, "text": "a2", "parentId": "0"},
{"id": 6, "text": "a2-1", "parentId": "5"},
{"id": 7, "text": "a2-2", "parentId": "5"},
{"id": 8, "text": "a2-3", "parentId": "5"},
{"id": 9, "text": "a2-1-1", "parentId": "6"},
{"id": 10, "text": "a2-1-2", "parentId": "6"},
{"id": 10, "text": "a2-2-2", "parentId": "6"},
{"id": 11, "text": "a3", "parentId": "0"},
{"id": 12, "text": "a3-1", "parentId": "5"},
]

"先分组"
teams=[]
for i in a:
    if i['parentId']=='0':
        teams.append(a.index(i))
# teams.append(10000000)
"每次取两个数值出来"
for i in teams:
    if i==teams[-1]:
        value = a[i:]
    else:
        value = a[i:teams[teams.index(i) + 1]]  # 需要处理的集合,里面包含了完整的一个
    # print value
    "list中分组,把同组的先归类到一起"
    for i in value:
        if i['parentId']=='0':
            i['children']=[]
    '循环第一层'
    folder_2=[]
    folder_3=[]
    for i in value:
        if i['text'].count('-')==1:
            folder_2.append(i)
        elif i['text'].count('-')==2:
            folder_3.append(i)
    if folder_3 != []:
        "根据三级菜单信息,插入对应的二级"
        for i in folder_2:
            i['children']=[]
            for j1 in folder_3:
                if j1['text'][:4]==i['text']:
                    i['children'].append(j1)
        # print folder_2
        "把二级写到一级"
    print 'f',folder_2
    print 'v',value[0]
    value[0]['children']=folder_2
    print value[0]

输出的内容为

f [{'text': 'a1-1', 'id': 2, 'parentId': '1'}, {'text': 'a1-2', 'id': 3, 'parentId': '1'}, {'text': 'a1-3', 'id': 4, 'parentId': '1'}]
v {'text': 'a1', 'children': [], 'id': 1, 'parentId': '0'}
{'text': 'a1', 'children': [{'text': 'a1-1', 'id': 2, 'parentId': '1'}, {'text': 'a1-2', 'id': 3, 'parentId': '1'}, {'text': 'a1-3', 'id': 4, 'parentId': '1'}], 'id': 1, 'parentId': '0'}
f [{'text': 'a2-1', 'children': [{'text': 'a2-1-1', 'id': 9, 'parentId': '6'}, {'text': 'a2-1-2', 'id': 10, 'parentId': '6'}], 'id': 6, 'parentId': '5'}, {'text': 'a2-2', 'children': [{'text': 'a2-2-2', 'id': 10, 'parentId': '6'}], 'id': 7, 'parentId': '5'}, {'text': 'a2-3', 'children': [], 'id': 8, 'parentId': '5'}]
v {'text': 'a2', 'children': [], 'id': 5, 'parentId': '0'}
{'text': 'a2', 'children': [{'text': 'a2-1', 'children': [{'text': 'a2-1-1', 'id': 9, 'parentId': '6'}, {'text': 'a2-1-2', 'id': 10, 'parentId': '6'}], 'id': 6, 'parentId': '5'}, {'text': 'a2-2', 'children': [{'text': 'a2-2-2', 'id': 10, 'parentId': '6'}], 'id': 7, 'parentId': '5'}, {'text': 'a2-3', 'children': [], 'id': 8, 'parentId': '5'}], 'id': 5, 'parentId': '0'}
f [{'text': 'a3-1', 'id': 12, 'parentId': '5'}]
v {'text': 'a3', 'children': [], 'id': 11, 'parentId': '0'}
{'text': 'a3', 'children': [{'text': 'a3-1', 'id': 12, 'parentId': '5'}], 'id': 11, 'parentId': '0'}
基本满足了要求。