#获取用户对应的职位 role_list = models.Role.objects.filter(role2userinfo__user=user.pk) #获取登陆用户的职位对应的权限表中的排除掉菜单的parent_id=None的数据 menu_leaf_list = models.Permission2Action.objects.filter(permission2action2role__role__in=role_list). \ exclude(url__menu__isnull=True).values("url__url","url__id", "url__title","url__menu").distinct() #创建空字典 menu_leaf_dict = {} #循环菜单中有parent_id的列表 for item in menu_leaf_list: #修改item字典数据名称并创建child空列表 item = { "id": item["url__id"], "url": item["url__url"], "title": item["url__title"], "parent_id": item["url__menu"], "child": [], } #如果menu_leaf_dict中包含parent_id就把数据添加到parent_id对应的列表中 if item["parent_id"] in menu_leaf_dict: menu_leaf_dict[item["parent_id"]].append(item) else: #如果不包含parent_id就在parent_id对应的values中创建一个空列表并把值添加到列表中 menu_leaf_dict[item["parent_id"]] = [item, ]
for k,v in menu_leaf_dict.items(): print(k,v) # 获取菜单的值 menu_list = models.Menu.objects.values( "id", "title", "parent_id") # 创建空字典 menu_dict = {} #遍历menu_list的所有元素并且在每个元素下创建一个key为child value为[]的元素 for item1 in menu_list: item1["child"] = [] #以菜单列表的每个元素的id为key 每个元素为value添加到menu_dict字典中 menu_dict[item1["id"]] = item1 # 遍历menu_leaf_dict把value添加到menu_dict的key相同的元素下 for k, v in menu_leaf_dict.items(): menu_dict[k]["child"] = v
result = [] # 遍历menu_dict的value也可以使用for row in menu_list获取每个菜单的所有元素 for row in menu_dict.values(): if row["parent_id"]: #如果value中parent_id不为None就把这个value添加到每个元素的parent_id和menu_dict[row[]"parent_id]相 # 对应的child列表中 menu_dict[row["parent_id"]]["child"].append(row) else: #如果parent_id为None就把值添加到result中,因为根菜单的paient_id都为None所以会先添加根菜单到result中 # 不需要把所有的元素都添加到child中因为列表和字典都是引用类型,所有的元素都会根据内存地址引用到相对应的 # 根菜单中 result.append(row)
|