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

303donatello發表於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(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()檢視函式中定義的區域性資料查詢結果,加上全域性變數當中已經完成了其他剩餘資料查詢,所以在滿足資料查詢需求的基礎上完成了檢視函式優化。

相關文章