1.可切片html
2.可迭代前端
3.惰性查詢:爲了節省內存web
book_list=Book.objects.all()惰性查詢,先取出queryset可是不會馬上執行sql語句,什麼時 候用何時執行sql
什麼時候用到查詢集:緩存
print(book_list)session
For...app
切片ide
If book_listurl
4.緩存機制(緩存到內存)spa
book.objects.all()
簡單的打印queryset不會緩存,執行兩次sql語句
print(book_list)
print(book_list)
正常的會緩存
For obj in book_list
For obj in book_list
執行兩次時,sql之執行一次
每一個queryset會維持一個緩存空間,
優勢:一次查詢,屢次使用
Book.objects.all().iterator() #生成器對象 將queryset封裝到生成器中
缺點:只能向下,只能用一次
在過濾器中:
1 @register.inclusion_tag("rbac/menu.html") 2 def get_menu_styles(request): 3 permission_menu_dict = request.session.get("permission_menu_dict") 4 print("permission_menu_dict",permission_menu_dict) 5 for val in permission_menu_dict.values(): 6 for item in val["children"]: 7 val["class"]="hide" 8 ret=re.search("^{}$".format(item["url"]),request.path) 9 if ret: 10 val["class"]="" #爲permission_menu_dict增長一個字段class 11 return {"permission_menu_dict":permission_menu_dict}
在與過濾器對應的menu.html中:
1 <div class="multi-menu"> 2 {% for item in permission_menu_dict.values %} 3 <div class="item"> 4 <div class="title"><i class="{{ item.menu_icon }}"></i>{{ item.menu_title }}</div> 5 <div class="body {{ item.class }}"> #爲body添加hide類名 6 {% for foo in item.children %} 7 <a href="{{ foo.url }}">{{ foo.title }}</a> 8 {% endfor %} 9 </div> 10 </div> 11 {% endfor %} 12 </div>
作法一:給按鈕的顯示加一個判斷
1 {% if "/customer/add/" in request.session.permission_list %} 2 <a class="btn btn-default" href="/customer/add/"> 3 <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客戶 4 </a> 5 {% endif %}
缺點:全部的按鈕都要判斷
作法二:.沒有權限的按鈕不顯示(過濾器版本)
作法封裝到一個過濾器中,避免代碼冗餘,前端在須要的地方調用便可
過濾器部分:
1 @register.filter 2 def has_permission(btn_url,request): 3 permission_names = request.session.get("permission_list") 4 return btn_url in permission_list
前端調用部分:
1 {% load web %} 2 {% if "/customer/add/"|has_permission:request %} 3 <a class="btn btn-default" href="/customer/add/"> 4 <i class="fa fa-plus-square" aria-hidden="true"></i> 添加客戶 5 </a> 6 {% endif %}
刪除,編輯部分:
表頭:
1 {% if "/customer/edit/(?P<cid>\d+)/"|has_permission:request %} 2 <th>編輯</th> 3 {% endif %} 4 {% if "/customer/del/(?P<cid>\d+)/"|has_permission:request %} 5 <th>刪除</th> 6 {% endif %}
表內容:
1 {% if "/customer/edit/(?P<cid>\d+)/"|has_permission:request %} 2 <td> 3 <a style="color: #333333;" href="/customer/edit/{{ row.id }}/"> 4 <i class="fa fa-edit" aria-hidden="true"></i></a> 5 </td> 6 {% endif %} 7 {% if "/customer/del/(?P<cid>\d+)/"|has_permission:request %} 8 <td> 9 <a style="color: #d9534f;" href="/customer/del/{{ row.id }}/"><i class="fa fa-trash-o"></i></a> 10 </td> 11 {% endif %}
缺點:作法麻煩
作法三:添加一個字段,之後用的時候就不用考慮路徑的正則問題
給permision加一個別名字段 name
取出來並注入session
1 permission_names=[] 2 for item in permissions: 3 permission_names.append(item["permissions__name"])
過濾器中使用:
1 @register.filter 2 def has_permission(btn_url,request): 3 permission_names=request.session.get("permission_names") 4 print("permission_names",permission_names) 5 return btn_url in permission_names
前端使用:
1 {% if "customer_edit"|has_permission:request %} 2 <td> 3 <a style="color: #333333;" href="/customer/edit/{{ row.id }}/"> 4 <i class="fa fa-edit" aria-hidden="true"></i></a> 5 </td> 6 {% endif %} 7 {% if "customer_del"|has_permission:request %} 8 <td> 9 <a style="color: #d9534f;" href="/customer/del/{{ row.id }}/"><i class="fa fa-trash-o"></i></a> 10 </td> 11 {% endif %}