2010-06-16 63 views
12

我的一個django模型有一個大的TextField,我經常不需要使用它。有沒有辦法讓django「懶加載」這個字段?即,除非明確要求,否則不要打擾將其從數據庫中提取出來。每當我引用這些對象時,我都在浪費大量的內存和帶寬,將這個TextField轉化爲python。可以在模型中使用django延遲加載字段嗎?

另一種方法是爲該字段的內容創建一個新表,但如果可以的話,我寧願避免這種複雜性。

回答

11

該功能發生在使用defer()語句而不是模型定義進行查詢時。看看這裏的文檔: http://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

現在,實際上,您的替代解決方案的重構和拉動數據到另一個表是一個非常好的解決方案。有些人會說,對延遲加載字段的需求意味着存在設計缺陷,並且應該對數據進行不同的建模。

無論哪種方式的作品,但!

5

對於這樣的事情,你可以重寫默認管理器。通常情況下,它不建議,但對於延遲()這是有道理的:

class CustomManager(models.Manager): 
     def get_queryset(self): 
      return super(CustomManager, self).get_queryset().defer('YOUR_TEXTFIELD_FIELDNAME') 

    class DjangoModel(models.Model): 
     objects = CustomerManager()