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. 转换Excel格式

    做一个功能需要将excel2003格式转成2007的格式,代码如下 需要引用office的microsoft.office.interop.excel.dll var app = new Micros ...

  2. cpp 学习笔记

    1.C++中模仿gets是  getline(cin, string object) #include <bits/stdc++.h> #define IOS ios::sync_with ...

  3. BigDecimal的使用举例,包括阶乘的相加求法思路

    对于高精度要求或者运算数较大的的计算,应该使用bigdecimal类实现 import java.math.BigDecimal; public class TestSysin { public st ...

  4. 小萝卜控机大师录制脚本(手机app自动化)

    手机自动化测试 之前发布过小萝贝控机大师与按键精灵结合实现手机自动化测试的功能,小萝贝控机大师升级了实现了更多手机自动化测试的功能,如下: l 手机功能自动化测试:录制脚本,检查点时点击小萝贝控机大师 ...

  5. 切图技巧——PS篇

    1.选框工具这里可以选择增加选区.减少选区 ==> 2.存储为web格式 1)JPG:一般用于大图 2)gif:可作动图,与png-8基本一样,不支持半透明 3)png-8:不支持动图,不支持半 ...

  6. 软件测试技术第一次试验之——JUnit的安装与使用

    众所周知,在一个大型的软件项目中,测试是必不可少的.传统的测试方法往往要自己编写测试函数再结合测试用例进行验证,这样会显得比较繁琐.所以我们可以使用JUnit框架进行测试. 使用junit的好处就是这 ...

  7. jQuery中的CSS-DOM操作

    html代码 <p style="color:blue;">武汉PHP培训-武汉长乐教育</p> css()方法 $("p").css( ...

  8. 栅格那点儿事(二)---细看Raster属性

    细看Raster属性 如果你已经看完了上一章,你已经了解了栅格数据是由一个个像元(Cell)按照行列方式构成的,每一个像元都有自己的像元值,并且这些像元值根据栅格类型的不同,可以代表反射值,或高程值, ...

  9. js报错 object is not a function

    主要是js函数名重名了,重命名就可以了.

  10. powershell解决win10开始菜单和通知中心无法打开

    然后通过 Ctrl + Shift + Esc 弹出任务管理器点击文件-->运行新任务 在打开的填写框里面输入 "powershell"同时勾选下方的"以管理员身份 ...