1. 程式人生 > >Django中views資料查詢使用locals()函式進行優化

Django中views資料查詢使用locals()函式進行優化

#優化場景 >利用檢視函式(views)查詢資料之後可以通過上下文context、字典、列表等方式將資料傳遞給HTML模板,由template引擎接收資料並完成解析。但是通過context傳遞資料可能就存在在不同的檢視函式中使用重複的查詢語句,所以可以通過將重複查詢語句設定全域性變數,配合locals()函式進行資料查詢與傳遞。 #優化前 ``` def index(request): threatname = '威脅情報展示' url = 'www.testtip.com' allthreat = Threat.objects.all() #推薦位的威脅情報 rec = Threat.objects.filter(rec__id=1)[:3] #情報標籤 threat_tags = Tag.objects.all() #將上述資料封裝至上下文中 context = { 'threatname': threatname, 'url': url, 'allthreat': allthreat, 'rec':rec, 'threat_tags':threat_tags, } #通過render傳遞上下文至模板templates return render(request,'index.html',context) def threatshow(request,tid): allthreat = Threat.objects.all() #推薦位的威脅情報 rec = Threat.objects.filter(rec__id=1)[:3] #情報標籤 threat_tags = Tag.objects.all() # 熱門情報資料 hot_threat = Threat.objects.filter(hot__id=x)[:6] #將sitename&url&allarticle封裝至上下文中 context = { 'allthreat': allthreat, 'rec':rec, 'threat_tags':threat_tags, 'hot_threat':hot_threat, } return render(request, 'threatshow.html',context) ``` 上面可以看到 `views` 裡面有 `index()`和 `threatshow()`兩個檢視函式,在這兩個檢視函式中有三個相同的資料查詢語句: ``` allthreat = Threat.objects.all() #推薦位的威脅情報 rec = Threat.objects.filter(rec__id=1)[:3] #情報標籤 threat_tags = Tag.objects.all() ``` #優化後 ##設定全域性變數 ``` # 全域性定義常用查詢資料引數 def global_variable(request): allthreat = Threat.objects.all() #推薦位的威脅情報 rec = Threat.objects.filter(rec__id=1)[:3] #情報標籤 threat_tags = Tag.objects.all() return locals() ``` `views`中定義上述全域性變數後,通過locals()函式優化如下: ``` def index(request): threatname = '威脅情報展示' url = 'www.testtip.com' #通過render傳遞上下文至模板templates return render(request,'index.html',locals()) def threatshow(request,tid): # 熱門情報資料 hot_threat = Threat.objects.filter(hot__id=x)[:6] return render(request, 'threatshow.html',locals()) ``` `Python`中的`locals()`函式會以字典型別返回當前位置的全部區域性變數,也就是返回當前`index()`、`threatshow()`檢視函式中定義的區域性資料查詢結果,加上全域性變數當中已經完成了其他剩餘資料查詢,所以在滿足資料查詢需求的基礎上完成了檢視函式