Heim > Backend-Entwicklung > Python-Tutorial > Beispiele für rekursive Python-Menüabfragen und Datenkonvertierung in JSON

Beispiele für rekursive Python-Menüabfragen und Datenkonvertierung in JSON

Y2J
Freigeben: 2017-04-21 16:18:21
Original
2699 Leute haben es durchsucht

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='菜单表';
Nach dem Login kopieren

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
Nach dem Login kopieren

Testmethode

  def test_set_subMenus(self):
    # 一级菜单
    rootMenus = queryByParent('')
    for menu in rootMenus:
      subMenus = queryByParent(menu.id)
      menu.subMenus = set_subMenus(menu.id, subMenus)
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

Bemerkungen:

  1. Wenn ein Menü kein Untermenü hat, löschen Sie das Attribut „subMenus“, sonst wird beim Konvertieren in Json ein Nullwert angezeigt

  2. Die Methode model_list_2_dto_list kann die Menüliste in konvertieren MenuDto List

  3. 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})
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage