我的UserProfile對象上有幾個包含JSON對象的TextField列。我還爲每列定義了setter/getter屬性,它封裝了將JSON序列化和反序列化爲Python數據結構的邏輯。如何在Django模型對象上記憶昂貴的計算?
這些數據的性質確保它可以在單個請求中被查看和模板邏輯多次訪問。爲了節省反序列化成本,我想在讀取時記憶python數據結構,直接寫入屬性或從模型對象保存信號時失效。
Where /如何存儲備忘錄?我對使用實例變量感到緊張,因爲我不明白任何特定的UserProfile如何通過查詢實例化。 __init__
可以安全使用,還是我需要通過hasattr()
在每次閱讀時檢查是否存在備忘屬性?
這是我目前執行的一個例子:
class UserProfile(Model):
text_json = models.TextField(default=text_defaults)
@property
def text(self):
if not hasattr(self, "text_memo"):
self.text_memo = None
self.text_memo = self.text_memo or simplejson.loads(self.text_json)
return self.text_memo
@text.setter
def text(self, value=None):
self.text_memo = None
self.text_json = simplejson.dumps(value)
這很好理解。謝謝。 – 2010-04-14 13:21:33
對於類方法,我更喜歡使用'django.utils.functional.cached_property'。由於類方法的第一個參數是'self',因此memoize將保留對該對象和函數結果的引用,即使在拋出它之後。這可以通過阻止垃圾收集器清除過時對象來導致內存泄漏。 'cached_property'將丹尼爾的建議變成了一個裝飾器。 – Arion 2012-07-12 18:05:24
Arion,這正是我所尋找的:-) – pstadler 2012-07-24 12:35:38