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": []
}]
}]

django中的构造字典(二级菜单,评论树,购物车)的更多相关文章

  1. django自定义rbac权限组件(二级菜单)

    一.目录结构 二.表结构设计 model.py from django.db import models # Create your models here. class Menu(models.Mo ...

  2. Html中鼠标悬停显示二级菜单的两种方法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. DJANGO结合jQuery cxSelect 作二级菜单过滤

    EN,到这个阶段,基本功能算是完成了. 使用了jQuery cxSelect这个插件. http://code.ciaoca.com/jquery/cxselect/ 相关代码如下: html: &l ...

  4. Django--CRM--一级, 二级 菜单表

    一. 一级菜单表 1. 首先要修改权限表的字段, 在权限表下面加上icon和 is_menu 的字段 2. 展示结果 # 我们既然想要动态生成一级菜单,那么就需要从数据库中拿出当前登录的用户的菜单表是 ...

  5. django中动态生成二级菜单

    一.动态显示二级菜单 1.修改权限表结构 (1)分析需求,要求左侧菜单如下显示: 客户管理: 客户列表 账单管理: 账单列表 (2)修改rbac下的models.py,修改后代码如下: from dj ...

  6. django权限之二级菜单

    遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None   反向查询,起名用的 ...

  7. Django - 权限(4)- queryset、二级菜单的默认显示、动态显示按钮权限

    一.queryset Queryset是django中构建的一种数据结构,ORM查询集往往是queryset数据类型,我们来进一步了解一下queryset的特点. 1.可切片 使用Python 的切片 ...

  8. 巨蟒django之权限7:动态生成一级&&二级菜单

    内容回顾: . 权限的控制 . 表结构设计 存权限的信息 用户表 - name 用户名 - pwd 密码 - roles 多对多 角色表 - name - permissions 多对多 权限表 - ...

  9. Django - 权限(3)- 动态显示二级菜单

    一.动态显示二级菜单 上篇随笔中,我们实现了动态显示一级菜单,现在考虑这样一种情况,用户的菜单权限比较多,这个时候全部并列展现在左侧菜单就不合适了,所以,现在有这样一个需求,即把用户的菜单权限分类,划 ...

随机推荐

  1. CAD安装失败怎样卸载CAD 2016?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  2. UGUI 用手柄或者键盘控制选择Scroll View中的游戏对象时,滚动条跟着移动

    原预制体以及脚本的下载地址:https://download.csdn.net/download/qq_15017279/10404010 1.新建一个Scroll View,删掉横向的滚动条,并且把 ...

  3. 学习用node.js建立一个简单的web服务器

    一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...

  4. php和java的区别

    php和java的区别 前几天有个大学的同学给我来电话,他是在培训java的,然后我们就讨论了一下关于php和java的优劣区别(我们的是初学者,所以下面发表的内容可能不会很精准到位,望体谅): 我们 ...

  5. PHP函数库(core)

    数组函数: array_change_key_case — 返回字符串键名全为小写或大写的数组 array_change_key_case() 将 input 数组中的所有键名改为全小写或大写.改变是 ...

  6. HDU 5335——Walk Out——————【贪心】

    Walk Out Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  7. 动态配置log4j2.xml日志输出文件的位置

    目标:根据启动jar时传进main()的参数动态修改日志位置 一.修改启动项 MainMapLookup.setMainArguments(args);注:不要在lookup设置之前初始化log(如: ...

  8. 二叉排序树思想及C语言实现

    转自: http://blog.chinaunix.net/uid-22663647-id-1771796.html 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找( ...

  9. python的变量命名及其使用

    以下内容皆从书本自学 ,归纳. 1. 变量名只能包含字母.数字和下划线.变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message. 2. ...

  10. 上下文ac获取为null,SpringContextUtil配置位置,以及各配置xml的加载顺序有讲究

    发现一个有趣的现象,一般job都会在执行前去初始化一次ac,而任务监视器SupervisorQueueJob不会,因此启动时初始化ac为null,SupervisorQueueJob会始终无法获取上下 ...