2013-04-18 17 views
0

我正在使用Django及其開箱即用的ORM。如果有一些模塊級變量,它們是否僅在應用程序啓動時才被評估?或者,如果在視圖中修改了它們,它們是否也會對每個請求進行評估?例如:Python變量作用域和延遲查詢集

from news.models import News 

# Module level variables 
draft_news = News.objects.filter(status='draft') 
live_news = News.objects.filter(status='prod') 

def view(request): 
    # outputs 10 an 10, respectively. 
    print 'There are %d news objects and %d live objects. Adding a draft article' % (draft_news.count(), live_news.count()) 

    n = News(
     content='This is test content', 
     status='draft', 
     slug='this-is-a-test3', 
     pubdatetime=datetime.now(), 
    ) 
    n.save() 

    print '...done. There are %d draft news objects.' % draft_news.count() # 11 objects 
    print 'Changing status to live...' 

    n.status='prod' 
    n.save() 

    print 'There are now %d live objects.' % live_news.count() # 11 objects 

由於查詢集是懶惰的,它們是否在模塊級別或視圖級別有關係嗎?我最初在管理命令中測試了上述代碼。

我們假設重構不是一個選項。

其他信息:我有幾個應用程序服務器(uWSGI)共享相同的數據庫。看來只有當我重啓所有這些進程的uWSGI進程時,模塊級變量纔會發生變化。換句話說,當在視圖中使用get_object_or_404時,新的News對象返回404。

+0

Django或類似SQLAlchemy?如果我們歸結爲特定的ORM可能會有所幫助。 – CppLearner

+0

@CppLearner django。我更新了我的問題。 – Chris

回答

0

不,它們不在模塊級別或視圖級別。

聲明本身不會觸發數據庫請求。只有當你要求具體的結果(如計數或開始迭代)時纔會發生實際的數據庫命中。

建議將它們保持在視圖級別以保持全局名稱空間的清潔。

更新:
.count()給人過時的結果問題是與Django的數據庫查詢caching,而不是懶惰更多的。考慮this question尋求解決方法。

+0

這是我的第一印象。查詢集很懶。但是我添加了一些額外的信息,這些信息有助於我的困惑。 – Chris

+0

我在代碼中看不到'get_object_or_404()' –

+0

我認爲它完全適合作爲另一個SO問題。你在這裏回答了我的問題並證實了我的直覺。 – Chris