1.构造父子结构:

1.1需求样式

客户列表 customer_list /customer/list/
-----> 添加客户 customer_add /customer/add/
-----> 编辑客户 customer_edit /customer/edit/(?P<cid>\d+)/
-----> 删除客户 customer_del /customer/del/(?P<cid>\d+)/
-----> 批量导入客户 customer_import /customer/import/
-----> 下载客户模板 customer_tpl /customer/tpl/
账单列表 payment_list /payment/list/
-----> 添加账单 payment_add /payment/add/
-----> 编辑账单 payment_edit /payment/edit/(?P<pid>\d+)/
-----> 删除账单 payment_del /payment/del/(?P<pid>\d+)/

django中构造方式:  ———>最重要的其实就是这里对于表结构的考虑

{
1:{
'title':'账单列表',
'url':'/payment/list/',
'name':'payment_list',
children:[
{'title':'删除账单','url':'/payment/list/','name':'payment_list'},
{'title':'编辑账单','url':'/payment/list/','name':'payment_list'},
{'title':'添加账单','url':'/payment/list/','name':'payment_list'},
]
},
2:{
'title':'客户列表',
'url':'/payment/list/',
'name':'payment_list',
children:[
{'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
{'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
{'title':'下载客户模板','url':'/payment/list/','name':'payment_list'},
]
}
}

models.py

class Menu(models.Model):
"""
菜单表
"""
title = models.CharField(max_length=32,unique=True)
icon = models.CharField(max_length=32)  def __str__(self):
return self.title class Permission(models.Model):
"""
权限表
"""
title = models.CharField(verbose_name='标题', max_length=32)
url = models.CharField(verbose_name='含正则的URL', max_length=128)
name = models.CharField(verbose_name='URL别名',max_length=32,null=True,blank=True)
parent = models.ForeignKey(verbose_name='父权限',to='Permission',null=True,blank=True)
menu = models.ForeignKey(verbose_name='菜单',to='Menu',null=True,blank=True) def __str__(self):
return self.title

# 有parent_id没有menu_id表示是具有三级菜单
# 有menu_id没有parent_id则表示是具有二级菜单
# 两者不能同时都有值

表数据

menu:

permission:

构造方式一:

def role_bbb(request):
permission_queryset = models.Permission.objects.all().values("id","title","url","name","parent_id")
root_permission_dict = {} for item in permission_queryset:
if not item["parent_id"]:
root_permission_dict[item["id"]] = {
"url":item["url"],
"title":item["title"],
"name":item["name"],
"children":[],
} for item in permission_queryset:
parent_id = item['parent_id'] if parent_id:
root_permission_dict[parent_id]['children'].append({
'title': item['title'],
'url': item['url'],
'name': item['name']
}) # 打印测试
for root in root_permission_dict.values():
print(root["title"],root['name'],root['url']) for node in root['children']:
print('----->', node['title'], node['name'], node['url']) return HttpResponse("+++++")

构造方式二:

def role_bbb(request):
root_permission_dict = {}
query = models.Permission.objects.filter(menu__isnull=False).values('id','title','url','name','parent_id')
for item in query:
root_permission_dict[item["id"]] = {
'title': item['title'],
'url': item['url'],
'name': item['name'],
'children': []
} models.Permission.objects.filter(menu__isnull=True).values('id','title','url','name','parent_id')
for item in query_dic:
parent_id = item['parent_id']
if parent_id:
root_permission_dict[parent_id]['children'].append({
'title': item['title'],
'url': item['url'],
'name': item['name']
}) # 打印测试
for root in root_permission_dict.values():
print(root["title"],root['name'],root['url']) for node in root['children']:
print('----->', node['title'], node['name'], node['url']) return HttpResponse("+++++")

构造方式三:

def role_bbb(request):
permission_queryset = models.Permission.objects.all().values("id", "title", "url", "name", "parent_id")
root_permission_dict = {}
for item in permission_queryset:
if not item['parent_id']:
root_permission_dict[item['id']] = {
'title': item['title'],
'url': item['url'],
'name': item['name'],
'children': []
}
else:
pid = item["parent_id"]
root_permission_dict[pid]["children"].append({
'title': item['title'],
'url': item['url'],
'name': item['name']
}) return HttpResponse("+++++")

2.构造家族结构   ------>用于构造评论树

2.1需求

  在实际应用中,我们对于一篇文章的评论通常包含了根评论,根评论下可以具有多个子评论,我们现在才可以通过构造数据结构来实现他所具有的功能

构造方式:

comment_list = [
{'id': 1, 'title': '根评论', 'pid': None},
{'id': 2, 'title': '根评论', 'pid': None},
{'id': 3, 'title': 'id是1下的评论', 'pid': 1},
{'id': 4, 'title': 'id是2下的评论', 'pid': 2},
{'id': 5, 'title': 'id是1下的评论', 'pid': 1},
{'id': 6, 'title': 'id是3下的评论', 'pid': 3},
{'id': 7, 'title': 'id是6下的评论', 'pid': 6},
]

演示代码:

comment_dict = {}
for item in comment_list:
item['children'] = []
comment_dict[item['id']] = item for row in comment_list:
if not row['pid']: # 判断根评论
continue # 跳过此次循环
pid = row['pid'] # 获取pid
# 最加到children中
comment_dict[pid]['children'].append(row) print(comment_dict)

效果:

{
1: {
'id': 1,
'title': '根评论',
'pid': None,
'children': [{
'id': 3,
'title': 'id是1下的评论',
'pid': 1,
'children': [{
'id': 6,
'title': 'id是3下的评论',
'pid': 3,
'children': [{
'id': 7,
'title': 'id是6下的评论',
'pid': 6,
'children': []
}]
}]
}, {
'id': 5,
'title': 'id是1下的评论',
'pid': 1,
'children': []
}]
},
2: {
'id': 2,
'title': '根评论',
'pid': None,
'children': [{
'id': 4,
'title': 'id是2下的评论',
'pid': 2,
'children': []
}]
},
3: {
'id': 3,
'title': 'id是1下的评论',
'pid': 1,
'children': [{
'id': 6,
'title': 'id是3下的评论',
'pid': 3,
'children': [{
'id': 7,
'title': 'id是6下的评论',
'pid': 6,
'children': []
}]
}]
},
4: {
'id': 4,
'title': 'id是2下的评论',
'pid': 2,
'children': []
},
5: {
'id': 5,
'title': 'id是1下的评论',
'pid': 1,
'children': []
},
6: {
'id': 6,
'title': 'id是3下的评论',
'pid': 3,
'children': [{
'id': 7,
'title': 'id是6下的评论',
'pid': 6,
'children': []
}]
},
7: {
'id': 7,
'title': 'id是6下的评论',
'pid': 6,
'children': []
}
}

这样可以构造,但是明显显得累赘,把子评论也全都打印了一遍

以上在做改进:

comment_dict = {}
for item in comment_list:
item['children'] = []
comment_dict[item['id']] = item result = []
for row in comment_list:
if not row['pid']: # 判断根评论
result.append(row) # 添加到列表
else:
pid = row['pid']
# 最加到children中
comment_dict[pid]['children'].append(row) print(result)

json序列化效果(想使用序列化格式工具转化,需要先转换成json格式才行,通过json.dumps):

[{
"title": "根评论",
"pid": null,
"id": 1,
"children": [{
"title": "id是1下的评论",
"pid": 1,
"id": 3,
"children": [{
"title": "id是3下的评论",
"pid": 3,
"id": 6,
"children": [{
"title": "id是6下的评论",
"pid": 6,
"id": 7,
"children": []
}]
}]
}, {
"title": "id是1下的评论",
"pid": 1,
"id": 5,
"children": []
}]
}, {
"title": "根评论",
"pid": null,
"id": 2,
"children": [{
"title": "id是2下的评论",
"pid": 2,
"id": 4,
"children": []
}]
}]

最新文章

  1. 旧版青奥遇到的bug
  2. linux查找进程,查找僵死进程,查找僵死进程并自动杀掉
  3. [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
  4. jQuery fullPage.js 全屏滚动
  5. easyUI笔记09.03
  6. C语言数组初始化
  7. poj 2245 Lotto
  8. ActionBar在Android2.x的实现,类似新版微信界面。
  9. Windows-004-显示文件的扩展名
  10. 抽象(abstract)升级版变接口(interface) 继承(extends)升级版叫实现(implements) 升级版啊升级版 接口可以多继承
  11. linux svn启动和关闭(转)
  12. Android中Application类用法
  13. 【转】PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
  14. raft协议安全性保证
  15. 最佳时间买入卖出股票 Best Time to Buy and Sell Stock LeetCode
  16. Mac 环境部署Docker私有仓库
  17. 单链表反转java代码
  18. Retrofit2 原理解析
  19. c/c++ 网络编程与多线程 编译参数
  20. CentOS 7安装nVIDIA显卡驱动程序

热门文章

  1. Windows 环境下安装MongoDB
  2. spring aop 原理学习
  3. rem布局,根据不用设备分辨率更改跟字体大小
  4. 07-spring之三大框架的整合
  5. 装配bean,基于xml
  6. intellijidea课程 intellijidea神器使用技巧1-5 idea界面介绍
  7. 简单二级导航JQ事件代码
  8. XHTML教会我的一些东西-2
  9. MySQL(三) 完整性约束
  10. 跨平台移动开发phonegap/cordova 3.3全系列教程-helloworld