zoukankan      html  css  js  c++  java
  • 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": []
        }]
    }]
  • 相关阅读:
    从尾到头打印链表
    剑指offer
    Codeforces Round #345
    算法入门系列之字符串
    【codenet】代码相似度计算框架调研 -- 把内容与形式分开
    【学习笔记--数据结构】合法的出栈序列与栈混洗
    我的博客即将入驻“云栖社区”,诚邀技术同仁一同入驻。
    【PAT L2-001】最短路计数
    【CF689D Friends and Subsequences】二分搜索,区间查询
    【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
  • 原文地址:https://www.cnblogs.com/LearningOnline/p/9545359.html
Copyright © 2011-2022 走看看