[英]Django - Lazy results with a context processor
我正在django項目中工作,該項目要求大多數公共頁面數據都是動態的。 每個頁面上顯示的內容(例如電話號碼,地址,主要聯系人電子郵件等)都需要通過管理面板進行編輯,因此將其存儲在settings.py文件中將無法正常工作。
為了解決這個問題,我創建了一個自定義上下文處理器,該處理器充當對“實時設置”模型的抽象引用。 該模型如下所示:
class LiveSetting(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=255, blank=False, null=False)
description = models.TextField(blank=True, null=True)
key = models.CharField(max_length=100, blank=False, null=False)
value = models.CharField(max_length=255, blank=True)
上下文處理器如下所示:
from livesettings.models import LiveSetting
class LiveSettingsProcessor(object):
def __getattr__(self, request):
val = LiveSetting.objects.get(request)
setattr(self, val.key, val.value)
return val.value
l = LiveSettingsProcessor()
def livesetting_processors(request):
return {'settings':l}
它的工作原理非常好,在我的模板中,我可以使用{{settings.primary_email}}並從數據庫中獲取相應的值。
上面的代碼的問題在於,它分別處理每個實時設置請求,並且每次在模板中使用我的{{settings。*}}標記時都會訪問數據庫。
是否有人知道我是否可以讓此過程變得懶惰,所以與其檢索值並返回它,不如更新一個QuerySet然后在呈現頁面之前一鍵返回結果?
您正在嘗試發明一些復雜的東西,而這並不是這樣做的原因。 像這樣簡單的事情可以使您足夠好:
def livesetting_processors(request):
settings = LiveSetting.objects.get(request)
return {'settings':settings}
編輯:
這是解決當前實施中問題的方法:
class LiveSettingsProcessor(object):
def __getattr__(self, request):
val = getattr(self, '_settings', LiveSetting.objects.get(request))
setattr(self, val.key, val.value)
return val.value
@韓盤,我已經更新了答案,顯示了如何解決問題,但是我想說的是,您要實現的目標並沒有取得任何實際的成功,但是它增加了復雜性,這需要花費時間。 稍后可能很難在所有這些上設置緩存。 啟用緩存后,這根本不會改善性能。
我不知道您是否曾聽過:過早的優化是邪惡的根源。 我認為SO上的該線程對於閱讀很有用: https : //stackoverflow.com/questions/211414/is-premature-optimization-really-the-root-of-all-evil
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.