ホームページ >バックエンド開発 >Python チュートリアル >Pythonの再帰クエリメニューの詳細説明とJSONへの変換サンプルコード

Pythonの再帰クエリメニューの詳細説明とJSONへの変換サンプルコード

高洛峰
高洛峰オリジナル
2017-03-28 09:16:252393ブラウズ

この記事では主に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


rreeee

so、再帰的にサブメナスを設定する方法は再定義されます


rreee

note:submenusサブメニューがない場合、「サブメナス」属性、それ以外の場合はnull値を削除しますJsonに変換すると表示されます

  1. model_list_2_dto_listメソッドでMenuリストをMenuDtoリストに変換できます

  2. to_pinyinは中国語の文字をピンインに変換するメソッドですここでは特に注意する必要はありません

  3. Json を返す View レイヤーのメソッド

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__

注: json と Python の辞書の意味は似ています。最終的に json がページに返されるときは、 json_dict メソッドを使用してそれを変換する必要があります。 dict 型を最初に指定します。それ以外の場合、返される文字列には "" が含まれます


クエリ結果

以上がPythonの再帰クエリメニューの詳細説明とJSONへの変換サンプルコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。