In diesem Artikel wird hauptsächlich das rekursive Abfragemenü von Python vorgestellt und in ein JSON-Beispiel umgewandelt. Interessierte Freunde können darauf verweisen.
Kürzlich musste ich ein Menü in Python schreiben, und es hat zwei oder drei Tage gedauert, bis ich es fertig hatte. Jetzt nehme ich es hier auf, und Freunde, die es brauchen, können daraus lernen.
Hinweis: Der Artikel zitiert den vollständigen nicht ausführbaren Code und stellt nur Auszüge aus den wichtigsten Teilen des Codes dar
Umgebung
Datenbank: MySQL
Python: 3.6
Tabellenstruktur
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-Code
Im Menu-Objekt gibt es einen Verweis auf die Untermenüliste „subMenus“, der Typ ist list
Core Code
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
Testmethode
def test_set_subMenus(self): # 一级菜单 rootMenus = queryByParent('') for menu in rootMenus: subMenus = queryByParent(menu.id) menu.subMenus = set_subMenus(menu.id, subMenus)
Hinweis: Der grundlegende Prozess besteht darin, zuerst das Menü der ersten Ebene abzufragen und dann die ID des Menüs auf dieser Ebene zu übergeben Die Untermenüliste dieses Ebenenmenüs wird in die Methode „set_subMenus“ umgewandelt und die untergeordneten Menüs der Untermenüliste werden rekursiv festgelegt.
unterstützt die Übergabe der Menü-ID, um alle Untermenüs unter dem Menü abzufragen. Wenn Sie ein Nullzeichen übergeben, beginnt die Abfrage im Stammverzeichnis
Im Objekt „rootMenus“ können Sie die vollständige Menübaumstruktur sehen
in Json konvertieren
Das ORM-Framework, das ich verwende, ist: sqlalchemy. Das direkt aus der Datenbank abgefragte Menüobjekt meldet einen Fehler, wenn es in Json konvertiert wird. Eine DTO-Klasse muss neu definiert werden, um das Menu-Objekt in ein Dto-Objekt zu konvertieren.
MenuDto
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
Die Methode zum rekursiven Festlegen von Untermenüs wird also neu definiert
def set_subMenuDtos(id, menuDtos): """ 根据传递过来的父菜单id,递归设置各层次父菜单的子菜单列表 :param id: 父级id :param menuDtos: 子菜单列表 :return: 如果这个菜单没有子菜单,返回None;如果有子菜单,返回子菜单列表 """ # 记录子菜单列表 subMenuDtos = [] # 遍历子菜单 for m in menuDtos: m.name = to_pinyin(m.menu_name) if m.parent == id: subMenuDtos.append(m) # 把子菜单的子菜单再循环一遍 for sub in subMenuDtos: menus2 = queryByParent(sub.id) menusDto2 = model_list_2_dto_list(menus2, "MenuDto(id='', menu_name='', menu_url='', type='', parent='', subMenus='')") # 还有子菜单 if len(menuDtos): if len(menusDto2): sub.subMenus = set_subMenuDtos(sub.id, menusDto2) else: # 没有子菜单,删除该节点 sub.delattr('subMenus') # 子菜单列表不为空 if len(subMenuDtos): return subMenuDtos else: # 没有子菜单了 return None
Bemerkungen:
Wenn ein Menü kein Untermenü hat, löschen Sie das Attribut „subMenus“, sonst wird beim Konvertieren in Json ein Nullwert angezeigt
Die Methode model_list_2_dto_list kann die Menüliste in konvertieren MenuDto List
to_pinyin ist eine Methode zum Konvertieren chinesischer Schriftzeichen in Pinyin. Sie müssen hier nicht auf die Methode von
achten Ansichtsebene, die Json zurückgibt
def get(self): param = request.args id = param['id'] # 如果id为空,查询的是从根目录开始的各级菜单 rootMenus = queryByParent(id) rootMenuDtos = model_list_2_dto_list(rootMenus, "MenuDto(id='', menu_name='', menu_url='', type='', parent='', subMenus='')") # 设置各级子菜单 for menu in rootMenuDtos: menu.name = to_pinyin(menu.menu_name) subMenus = queryByParent(menu.id) if len(subMenus): subMenuDtos = model_list_2_dto_list(subMenus, "MenuDto(id='', menu_name='', menu_url='', type='', parent='', subMenus='')") menu.subMenus = set_subMenuDtos(menu.id, subMenuDtos) else: menu.delattr('subMenus') menus_json = json.dumps(rootMenuDtos, default=lambda o: o.dict, sort_keys=True, allow_nan=false, skipkeys=true) # 需要转字典,否则返回的字符串会带有“\” menus_dict = json_dict(menus_json) return fullResponse(menus_dict) fullResponse from flask import jsonify def fullResponse(data='', msg='', code=0): if msg == '': return jsonify({'code': code, 'data': data}) elif data == '': return jsonify({'code': code, 'msg': msg}) else: return jsonify({'code': code, 'msg': msg, 'data': data})
Hinweis: Die Bedeutung von JSON und Wörterbuch in Python ist ähnlich. Wenn JSON schließlich an die Seite zurückgegeben wird, müssen Sie zum Konvertieren die Methode json_dict verwenden Geben Sie zuerst den Typ ein, andernfalls enthält die zurückgegebene Zeichenfolge „“
Abfrageergebnisse
Das obige ist der detaillierte Inhalt vonBeispiele für rekursive Python-Menüabfragen und Datenkonvertierung in JSON. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!