2010-06-25 10 views
1

我有一個模塊pagetypes.py提取一些常量的(我真的不應該用這個詞常在這裏)從該數據庫以備後用:在某處意見如何在Fixture加載到Django中的db之後對ORM調用進行延遲評估?

def _get_page_type_(type): 
    return PageType.objects.get(type=type) 

PAGE_TYPE_MAIN = _get_page_type_('Main') 
PAGE_TYPE_OTHER = _get_page_type_('Other') 

然後我做的:

import pagetypes 
... 
print pagetypes.PAGE_TYPE_MAIN #simplified 

這一切都正常工作時,db有這些記錄,我確信它沒有...除非此代碼正在測試。在這種情況下,我想通過燈具將這些記錄加載到數據庫中。但問題是,燈具不加載(甚至syncdb不運行)的時候pagetypes模塊導入導致_get_page_type_電話與失敗:

psycopg2.ProgrammingError: relation "pagetype" does not exist 

測試運行總是嘗試導入pagetypes模塊,因爲它是通過正在測試的視圖導入。

我該如何解決這個問題?

我在想延遲加載網頁類型常數PAGE_TYPE_MAINPAGE_TYPE_OTHER,但後來我想,如果這些記錄不是在DB(或夾具如果被測)到早期失敗了,所以我真的不知道如何實現這個。

我也在考慮對象級別的緩存,只要調用PageType.objects.get(type=type)就可以使用/調用常量,但這不是一個矯枉過正的問題嗎?調用沒有緩存的orm會導致太多的數據庫調用,我想阻止它。

它必須是非常簡單的東西,但我不能解決它。 ;-)

回答

2

我會使用的功能,而不是常量,但他們memoize的:

_cache = {} 

def get_page_type(type_name): 
    if type_name not in _cache: 
     _cache[type_name] = PageType.objects.get(type=type_name) 
    return _cache[type_name] 

所以,現在你會直接打電話get_page_type('Main')必要時。

+0

這很聰明,很簡單。 – googletorp 2010-06-25 18:34:21

+0

我稍微修改你的代碼少做打字我想使用的頁面類型常量每次: 'PAGE_TYPE_MAIN =屬性(拉姆達:get_page_type(「主」))' 我使用了一些代碼,從http:// stackoverflow.com/questions/880530/can-python-modules-have-properties-the-same-way-that-objects-can可以使'property'在模塊級別上工作。工作正常,謝謝! – parxier 2010-06-26 16:39:10

相關問題