django中的构造字典(二级菜单,评论树,购物车)

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": []
    }]
}]
原文地址:https://www.cnblogs.com/LearningOnline/p/9545359.html