Django中views資料查詢使用locals()函式進行優化
阿新 • • 發佈:2020-08-23
優化場景
利用檢視函式(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(tui__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(tui__id=x)[:6] return render(request, 'threatshow.html',locals())