需求:菜单管理功能(增、删、改),多级树形菜单展示

数据库表设计

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)
 

 

Python 递归返回树形菜单JSON串 <flask>的更多相关文章

  1. 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等

    1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...

  2. PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹

    PHP递归获得树形菜单和遍历文件夹下的所有文件以及子文件夹 一.使用递归获取树形菜单 数据表category(id,name,parent_id) <?php class category{ / ...

  3. java 传入list集合 返回树形菜单,for循环遍历

    public List<SysPermissionVO> getTreeMenu(List<SysPermissionVO> list,SysPermissionVO sysP ...

  4. [Python] 递归返回值 为 None 的问题

    递归返回值 为 None 的问题 解决办法: 在递归调用下一个 递归 函数前面,一定要加上 return,否则就会返回 None 如红色 所处的return: def getAllCityUrl(ur ...

  5. JAVA递归生成树形菜单

    递归生成一个如图的菜单,编写两个类数据模型Menu.和创建树形的MenuTree.通过以下过程实现: 1.首先从菜单数据中获取所有根节点. 2.为根节点建立次级子树并拼接上. 3.递归为子节点建立次级 ...

  6. python字典、字符串(json串)、字节串之间的转化

    字典和json字符串(本质也是字符串)之间的转化用json.dumps和json.loads() json.dumps():   字典→json字符串 json.loads():     json字符 ...

  7. Unity 引擎UGUI之自定义树形菜单(TreeView)

    先上几张效果图:          如果你需要的也是这种效果,那你就来对地方了! 目前,我们这个树形菜单展现出来的功能如下: 1.可以动态配置数据源: 2.点击每个元素的上下文菜单按钮(也就是图中的三 ...

  8. DWZ中Tree树形菜单的treeCheck如何获取返回值解决方案

    最近在对DWZ和asp.net MVC3进行整合,其中遇到了很多问题,总算一一解决了,今天就说说题目所示的问题解决方案. 想做一个基于角色的权限管理,要对每一个Action进行权限控制.就想用DWZ的 ...

  9. 构建简单的json树形菜单

    json结构: var Menu = [{ tit:"一级菜单", submenu:[{ tit:"二级菜单", url:"", func: ...

随机推荐

  1. OpenResty 最佳实践 (2)

    此文已由作者汤晓静授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. lua 协程与 nginx 事件机制结合 文章前部分用大量篇幅阐述了 lua 和 nginx 的相关知识,包 ...

  2. 二、搭建SpringBoot项目

    与其说是搭建,还不如说去下载...(注意,在此之前要确保你的3000块钱的笔记本上安装了JDK8+已经最新的相对较新的maven:apache-maven-3.6.0,至于JDK以及maven的相关安 ...

  3. Delphi XE8如何同Eclipse使用相同的Android SDK?

    我的Android SDK是单独安装的:Eclipse也是最新版的,并不是谷歌提供的集成了SDK的那个Eclipse:Delphi XE8安装后,我并没有通过XE8里面下载Android SDK到XE ...

  4. MVC,MVP 和 MVVM 的区别之处

    其实我一直以来,虽然做的是前端的工作,但是有一个疑问,就是什么是mvc模式,虽然大概知道,但是具体确实说不上来的的,今天,我就好好总结一下mvc ,mvp,mvvm模式的区别与相同. 1.MVC模式: ...

  5. jmeter函数助手(_random、_time)

    jmeter函数助手 __random __time yyyyMMddHHmmdd  时间格式(年月日时分秒) 1.打开函数助手对话框,选项->函数助手对话框 2.生成函数字符串 (1)选择功能 ...

  6. Scrapy爬虫入门Request和Response(请求和响应)

    开发环境:Python 3.6.0 版本 (当前最新)Scrapy 1.3.2 版本 (当前最新) 请求和响应 Scrapy的Request和Response对象用于爬网网站. 通常,Request对 ...

  7. kill 进程的一些小细节

    终止前台进程,可以用Ctrl+C组合键.但对于后台进程需要用kill命令. kill PID 还可以加信号(参数),默认情况下是编号为15的信号.term信号将终止所有不能捕捉该信号的进程. -s 可 ...

  8. SpringMVC配置文件dispatcherServlet-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. 1.1、Logistics Regression模型

    1.线性可分VS线性不可分 对于一个分类问题,通常可以分为线性可分与线性不可分两种 .如果一个分类问题可以使用线性判别函数正确的分类,则称该问题为线性可分.如图所示为线性可分,否则为线性不可分: 下图 ...

  10. RNA-seq分析htseq-count的使用

    HTSeq作为一款可以处理高通量数据的python包,由Simon Anders, Paul Theodor Pyl, Wolfgang Huber等人携手推出HTSeq — A Python fra ...