2011-12-24 22 views
1

我讀過濾器和Django文檔排除,但我想知道,如果我將使用下面的代碼:Django過濾和排除對性能的影響?

Entry.objects.filter(
    ...  headline__startswith='What' 
    ...).exclude(
...  pub_date__gte=datetime.now() 
...).filter(
...  pub_date__gte=datetime(2005, 1, 1) 
...) 

然後,將它造成1個查詢或查詢4?它會首先查詢並獲取所有對象,然後在從mysql/db獲取所有記錄後進行過濾和排除,或者它將全部在mysql/db級別完成。因爲如果它不會在數據庫級別完成,那麼它可能會導致性能問題。這就是爲什麼我想知道,將過濾和排除應用程序級別或數據庫級別的工作?

回答

1

我得到了我的問題的答案,那就是:

查詢集懶惰 - 創建一個查詢集的行爲不涉及任何:爲自己的Django文檔中說 查詢將只執行一次數據庫活動。您可以將過濾器整天堆疊在一起,並且Django實際上不會運行查詢,直到QuerySet被評估爲止 和 雖然看起來像三個數據庫命中,但實際上它只在最後一行命中數據庫一次(print q )。一般來說,直到你「詢問」它們之前,QuerySet的結果都不會從數據庫中獲取。當你這樣做時,通過訪問數據庫來評估QuerySet。 有關確切何時進行評估的更多詳細信息,請參閱"When QuerySets are evaluated"

0

只是爲了完成哈菲茲的回答,我在這裏貼了他的解釋代碼。 (當你提到print(q)時,我有點失落,雖然你提供了鏈接!)

>>> q = Entry.objects.filter(headline__startswith="What") 
>>> q = q.filter(pub_date__lte=datetime.date.today()) 
>>> q = q.exclude(body_text__icontains="food") 
>>> print(q)