Python 遞歸返回樹形菜單JSON串


需求:菜單管理功能(增、刪、改),多級樹形菜單展示

數據庫表設計

create table if not exists Menu(
    id serial  primary key ,
    title varchar (50) not null ,
    parent_id int ,
    url varchar (100),
    app_id int ,
    icon varchar (50),
    sortby int default 0,
    create_time timestamp,
    update_time timestamp,
    foreign key (parent_id) references Menu(id) on delete cascade on update cascade
);

 

Model 定義

class Menu:
    def __init__(self, id, title, parent_id, url, app_id, icon, sort_by, create_time, update_time, subMenus):
        self._id = id
        self._title = title
        self._parent_id = parent_id
        self._url = url
        self._app_id = app_id
        self._icon = icon
        self._sortby = sort_by
        self._create_time = create_time
        self._update_time = update_time
        self._subMenus = subMenus

    @property
    def id(self):
        return self._id
    @property
    def title(self):
        return self._title
    @property
    def parent_id(self):
        return self._parent_id
    @property
    def url(self):
        return self._url
    @property
    def app_id(self):
        return self._app_id
    @property
    def icon(self):
        return self._icon
    @property
    def sortby(self):
        return self._sortby
    @property
    def subMenus(self):
        return self._subMenus

理論上Models應該中的參數應該和數據庫表字段對應,但是subMenus我們不需要存庫,反給前端用的。

核心代碼

 

def set_subMenus(id, menus):
        """
        :param id: 父id
        :param subMenu:子菜單列表
        :return: 沒有子菜單返回None 有子菜單返回子菜單列表
        """
        try:
            _subMenus = []

            for menu in menus:
                if menu.parent_id == id:
                    _subMenus.append(menu)
            for sub in _subMenus:
                menu2 = _query_sub_menu_info(sub.id)
                if len(menus):
                    sub._subMenus = set_subMenus(sub.id, menu2)
                else:
                    sub.__delattr__('_subMenus')
            # 子菜單列表不為空
            if len(_subMenus):
                # print(sub_list)
                return _subMenus
            else:  # 沒有子菜單了
                return None
        except Exception as e:
            LOG.exception('error query_sub_menu_info !')
            raise e

 

_query_sub_menu_info 方法是查詢返回

測試方法:
def test_sub_menu_list(self):
        Menus = []
        rootMenu = GuardianModelDao._query_root_menu_info()
        for root in rootMenu:
            subMenu = GuardianModelDao._query_sub_menu_info(root.id)
            root = jsonpickle.loads(jsonpickle.encode(root))
            if root.subMenus is not None:
                root.subMenus.append(GuardianModelDao.set_subMenus(root.id, subMenu))
                Menus.append(root)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM