2011-01-14 106 views
13

我有一個第三方函數,它給了我一個過濾的查詢集(例如記錄與'有效'= True),但我想刪除一個特定的條件(例如有所有記錄,有效和無效)。Django:從查詢集中刪除過濾條件

有沒有辦法將過濾條件移除到已經過濾的查詢集?

E.g.

only_valid = MyModel.objects.filter(valid=True) 
all_records = only_valid.**remove_filter**('valid') 

(我知道,這將是更好的前 'only_valid' 定義 'all_records',但是這只是一個例子......)

+0

您可以顯示的代碼示例,請? – 2011-01-14 09:25:15

回答

4

the docs

每次您優化了一個QuerySet,您會得到一個全新的QuerySet,它絕不會綁定到以前的QuerySet。每個優化都會創建一個獨立且不同的QuerySet,可以存儲,使用和重用。

因此,我懷疑是否有一個標準的方法來做到這一點。你可以dig into the code,看看filter()做什麼,然後嘗試一下。如果這沒有幫助,我的假設是,你運氣不好,需要自己重新構建查詢。

10

雖然沒有官方的方式使用過濾符號來做到這一點,但您可以使用Q -notation輕鬆做到這一點。 例如,如果你確保,第三部分函數返回問答對象,而不是過濾查詢集,你可以做到以下幾點:

q = ThirdParty() 
q = q | Q(valid=False) 

而生成的SQL條件使用或施工人員加盟。

+0

您需要訪問第三方代碼,但是,這是一個很好的解決方案。 +1 – Boldewyn 2011-01-14 11:30:03

1

以下是我在類似情況下所做的操作。

all_records = MyModel.objects.all() 
only_valid = MyModel.objects.filter(valid=True) 
only_valid.original = all_records 

... 

all_records = only_valid.original 

很明顯,這也清除了其他任何過濾器,所以它不適合每一種情況。

0

感謝您讓我檢查源代碼Boldewyn。因此,似乎有右下方濾波器()具有相同參數的新方法......叫exclude()(作爲犯小散ef6c680,因爲當它失去了它的行號)

返回一個新的QuerySet實例與NOT(args)AND與現有的集合。

因此,要回答原來的問題:

only_valid = MyModel.objects.filter(valid=True) 
filtered_results = only_valid.exclude(the_condition_to_remove=True) 
+0

`exclude`只是添加另一個過濾器,保留現有的過濾器。它不會恢復完整的查詢集。 – Don 2018-01-24 08:09:04