


Ausführliche Erläuterung des rekursiven Python-Abfragemenüs und der Konvertierung in JSON-Beispielcode
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
Kerncode
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 und die Untermenüliste dieses Ebenenmenüs an die Methode set_subMenus zu übergeben, um die Menüs der unteren Ebene der Untermenüliste rekursiv festzulegen ;
unterstützt die Übergabe der Menü-ID, Abfrage aller Untermenüs unter diesem Menü. 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ü keine Untermenüs hat, löschen Sie das Attribut „subMenus“, sonst wird bei der Konvertierung in Json ein Nullwert angezeigt
Die Methode „model_list_2_dto_list“ kann die Menüliste in die Liste „MenuDto“ konvertieren.
to_pinyin ist eine Methode zum Konvertieren chinesischer Schriftzeichen in Pinyin. Hier müssen Sie nicht darauf achten.
Ansichtsebene gibt Json-Methode zurück
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 , am Ende Wenn json an die Seite zurückgegeben wird, müssen Sie es zuerst mit der Methode json_dict in den Dikttyp konvertieren, andernfalls enthält die zurückgegebene Zeichenfolge „“
Abfrageergebnisse
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung des rekursiven Python-Abfragemenüs und der Konvertierung in JSON-Beispielcode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie lehre ich innerhalb von 10 Stunden die Grundlagen für Computer -Anfänger für Programmierungen? Wenn Sie nur 10 Stunden Zeit haben, um Computer -Anfänger zu unterrichten, was Sie mit Programmierkenntnissen unterrichten möchten, was würden Sie dann beibringen ...

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie kann man nicht erkannt werden, wenn Sie Fiddlereverywhere für Man-in-the-Middle-Lesungen verwenden, wenn Sie FiddLereverywhere verwenden ...

Regelmäßige Ausdrücke sind leistungsstarke Tools für Musteranpassung und Textmanipulation in der Programmierung, wodurch die Effizienz bei der Textverarbeitung in verschiedenen Anwendungen verbessert wird.

Wie hört Uvicorn kontinuierlich auf HTTP -Anfragen an? Uvicorn ist ein leichter Webserver, der auf ASGI basiert. Eine seiner Kernfunktionen ist es, auf HTTP -Anfragen zu hören und weiterzumachen ...

In dem Artikel werden beliebte Python-Bibliotheken wie Numpy, Pandas, Matplotlib, Scikit-Learn, TensorFlow, Django, Flask und Anfragen erörtert, die ihre Verwendung in wissenschaftlichen Computing, Datenanalyse, Visualisierung, maschinellem Lernen, Webentwicklung und h beschreiben

Wie erstellt in Python ein Objekt dynamisch über eine Zeichenfolge und ruft seine Methoden auf? Dies ist eine häufige Programmieranforderung, insbesondere wenn sie konfiguriert oder ausgeführt werden muss ...
