2012-04-09 88 views
3

我已經緩存了一個常見的查詢集,我想根據情況根據不同的字段進行過濾。我想知道是否通過篩選評估的查詢集,如果我失去了首先緩存它的優勢; Django是否只是從頭開始創建另一個查詢集,這是創建緩存查詢集所涉及的查詢集合以及之後應用的過濾器的集合?Django如何進行篩選評估的查詢集?

回答

5

是的,結果被拋出。

您可以從源看到這一點:filter()電話_filter_or_exclude(),這就要求_clone(),然後添加到它的查詢。 _clone,你可以看到,沒有設置_result_cache屬性。

總的來說,我們不太清楚它能做些什麼來保持共同的結果。如果它是一個帶有小結果集的複雜查詢,它可以替換爲只發出SQL來檢查主鍵是您找到的結果之一,但這並不總是更有效,在某些情況下會混淆語義(如果數據庫以影響查詢結果的方式進行更改,而這種方式會影響查詢結果的緩存時間和添加過濾器之間的時間)。

如果要強制手動保存的ID的這種行爲,你可以這樣做:

pks = SomeObject.objects.filter(...).values_list('pk', flat=True) 
some_of_them = SomeObject.objects.filter(pk_in=pks).filter(...) 
others = SomeObject.objects.filter(pk_in=pks).filter(...) 

您還可以,當然只是做過濾在Python,例如通過

common = SomeObject.objects.filter(...) 
some_of_them = [m for m in common if m.attribute == 'foo'] 
others = [m for m in common if m.other_attribute == 'bar'] 

(你也可以使用filter(lambda m: m.attribute == 'foo', common)如果你首選,或包裹的common的定義list更加明確。)

無論這些或一個補發查詢很大程度上取決於大小所涉及的集合,過濾器的複雜性以及存在的指標。