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中構造方式:  ———>最重要的其實就是這裏對於表結構的考慮node

{ 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.pydjango

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則表示是具備二級菜單
# 二者不能同時都有值json

表數據數據結構

menu:app

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("+++++")

構造方式二:url

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("+++++")

 構造方式三:spa

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需求

  在實際應用中,咱們對於一篇文章的評論一般包含了根評論,根評論下能夠具備多個子評論,咱們如今才能夠經過構造數據結構來實現他所具備的功能code

構造方式:

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": [] }] }]
相關文章
相關標籤/搜索