python生成樹形結構 選單 tree

2021-10-22 12:17:05 字數 2101 閱讀 1787

首先需要設計表結構,包含父子關聯關係,例如

class

menu

(models.model)

:"""

許可權"""

title = models.charfield(max_length=

128, unique=

true

, verbose_name=

"標題"

) name = models.charfield(max_length=

128, unique=

true

, verbose_name=

"編碼"

) path = models.charfield(max_length=

256, blank=

true

, null=

true

, verbose_name=

'含正則的url'

) parent_id = models.integerfield(verbose_name=

'父選單id'

)

編寫生成tree方法,具體用法看說明,呼叫方式get_trees(menu.objects.values().all())

# 生成樹結構

defget_trees

(data,

key_column=

'id'

, parent_column=

'parent_id'

, child_column=

'children'

, current_column=

none

, current_path=

none):

""" :param data: 資料列表

:param key_column: 主鍵字段,預設id

:param parent_column: 父id欄位名,父id預設從0開始

:param child_column: 子列表字典名稱

:param current_column: 當前展開值欄位名,若找到展開值增加['open'] = '1'

:param current_path: 當前展開值

:return: 樹結構

"""data_dic =

for d in data:

data_dic[d.get(key_column)

]= d # 以自己的許可權主鍵為鍵,以新構建的字典為值,構造新的字典

data_tree_list =

# 整個資料大列表

for d_id, d_dic in data_dic.items():

pid = d_dic.get(parent_column)

# 取每乙個字典中的父id

ifnot pid:

# 父id=0,就直接加入資料大列表

else

:# 父id>0 就加入父id隊對應的那個的節點列表

try:

# 判斷異常代表有子節點,增加子節點列表=

data_dic[pid]

[child_column]

except keyerror:

data_dic[pid]

[child_column]=[

] data_dic[pid]

[child_column]

# 展開節點

if current_path:

if current_path == d_dic.get(current_column)

: d_dic[

'open']=

'1'while pid:

data_dic[pid]

['open']=

'1' pid = data_dic[pid]

[parent_column]

return data_tree_list

Java 生成樹形選單

分享乙個 樹形選單,一般生成樹形選單都是通過遞迴遍歷,或者 通過 nosql 儲存 此篇 介紹乙個 遞迴 樹形選單的 工具類 廢話不多說 上 author 作者 小布 version 建立時間 2019年3月18日 下午3 01 27 explain 類說明 樹形選單 public final cl...

vue element樹形結構右鍵選單

環境 vue admin template vue 2.6.10 element ui 2.7.0 1 自定義元件,檔案位置 src components mentcontext dropmenu style style style display block v show show mousedo...

通過lambda實現選單樹形結構

public list listwithtree sorted menu1,menu2 collect collectors.tolist return level1menus 遞迴查詢當前選單的子選單 param root param all return private list getchil...