この記事では主にPythonの再帰クエリメニューを紹介し、それをJSONのサンプルに変換します。興味のある方は参考にしてください。
最近、Python でメニューを書く必要がありましたが、完了するまでに 2 ~ 3 日かかりました。今はそれをここに記録し、必要な友人がそこから学ぶことができます。
注: この記事では、実行不可能な完全なコードを引用しています。コードの重要な部分のみを抜粋しています
環境
データベース: mysql
Python: 3.6
T有能な構造
CREATE TABLE `tb_menu` ( `id` varchar(32) NOT NULL COMMENT '唯一标识', `menu_name` varchar(40) DEFAULT NULL COMMENT '菜单名称', `menu_url` varchar(100) DEFAULT NULL COMMENT '菜单链接', `type` varchar(1) DEFAULT NULL COMMENT '类型', `parent` varchar(32) DEFAULT NULL COMMENT '父级目录id', `del_flag` varchar(1) NOT NULL DEFAULT '0' COMMENT '删除标志 0:不删除 1:已删除', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单表';
Pythonコード
Menuオブジェクト、サブメニューリスト「subMenus」への参照があります、タイプはlistです
コアコード
def set_subMenus(id, menus): """ 根据传递过来的父菜单id,递归设置各层次父菜单的子菜单列表 :param id: 父级id :param menus: 子菜单列表 :return: 如果这个菜单没有子菜单,返回None;如果有子菜单,返回子菜单列表 """ # 记录子菜单列表 subMenus = [] # 遍历子菜单 for m in menus: if m.parent == id: subMenus.append(m) # 把子菜单的子菜单再循环一遍 for sub in subMenus: menus2 = queryByParent(sub.id) # 还有子菜单 if len(menus): sub.subMenus = set_subMenus(sub.id, menus2) # 子菜单列表不为空 if len(subMenus): return subMenus else: # 没有子菜单了 return None
テストメソッド
def test_set_subMenus(self): # 一级菜单 rootMenus = queryByParent('') for menu in rootMenus: subMenus = queryByParent(menu.id) menu.subMenus = set_subMenus(menu.id, subMenus)
準備 注: 基本的なプロセスは次のとおりです。まず最初のレベルのメニューをクエリし、次にそのレベルのメニューの ID とこのレベルのメニューのサブメニュー リストを set_subMenus メソッドに渡し、下位レベルのメニューを再帰的に設定します。サブメニュー リスト
は、このメニューのすべてのサブメニューのクエリをサポートします。 Null 文字を渡すと、クエリはルート ディレクトリから開始されます
「rootMenus」オブジェクトで、完全なメニュー ツリー構造を確認できます
Json に変換します
私が使用する ORM フレームワークは次のとおりです: sqlalchemy,データベースから直接クエリされた Menu オブジェクトは、Json に変換されるときにエラーを報告します。 Menu オブジェクトを Dto オブジェクトに変換するには、DTO クラスを再定義する必要があります。
menudto
so、再帰的にサブメナスを設定する方法は再定義されます
note:submenusサブメニューがない場合、「サブメナス」属性、それ以外の場合はnull値を削除しますJsonに変換すると表示されます
model_list_2_dto_listメソッドでMenuリストをMenuDtoリストに変換できます
to_pinyinは中国語の文字をピンインに変換するメソッドですここでは特に注意する必要はありません
class MenuDto(): def __init__(self, id, menu_name, menu_url, type, parent, subMenus): super().__init__() self.id = id self.menu_name = menu_name self.menu_url = menu_url self.type = type self.parent = parent self.subMenus = subMenus def __str__(self): return '%s(id=%s,menu_name=%s,menu_url=%s,type=%s,parent=%s)' % ( self.__class__.__name__, self.id, self.menu_name, self.menu_url, self.type, self.parent) __repr = __str__
以上がPythonの再帰クエリメニューの詳細説明とJSONへの変換サンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。