2011-01-14 13 views
13

フィルタリングされたクエリーセットを提供するサードパーティーの機能を持っています(たとえば、 'valid' = Trueのレコード)が、特定の条件を削除したい有効と無効の両方)。Django:クエリーセットからフィルター条件を削除する

すでにフィルタされたクエリセットにフィルタ条件を削除する方法はありますか?

など。 the docsから

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

(私はonly_valid "の前に 'all_records' を定義する方が良いだろうことを知っているが、これは単なる一例です...)

+0

をあなたは、コード例を示してくださいことはできますか? –

答えて

4

たびにあなたがQuerySetを改良すると、まったく前のQuerySetにバインドされていないまったく新しいQuerySetが得られます。各リファインメントは、保存され、使用され、再利用される個別の個別のQuerySetを作成します。

したがって、私はそれを行う標準的な方法があると思います。あなたはdig into the codeを見ることができ、何を参照してください、filter()して少し試してみてください。それが助けにならなければ、私の前提は、あなたは不運であり、自分でクエリを再構築する必要があるということです。

10

フィルター表記法を使用してこれを行う公式の方法はありませんが、Q -notationで簡単に行うことができます。たとえば 、あなたはその第三部構成の機能は、Qオブジェクトではなく、フィルタクエリセットを返し、次の操作を行うことを確認した場合:

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

、得られるSQL条件は、使用してOR演算子結合されます。

+0

サードパーティのコードにアクセスする必要がありますが、それは良い解決策です。 +1 – Boldewyn

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を確認してくれてありがとう。だから、同じパラメータで)右フィルタ(以下、新たな方法がありますようだ...(それはその行番号を失ったときのために、ミニハッシュef6c680をコミットすると)exclude()と呼ば

戻り、新たなクエリセットのインスタンスNOT(args)をANDで既存のセットに追加します。だから、

、元の質問に答えるために:

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

'exclude'は別のフィルタを追加して既存のフィルタを保持します。完全なクエリーセットは復元されません。 – Don

+0

ああ、私は参照してください!私はそれからその質問を誤解した。それをクリアしていただきありがとうございます:) – iddy

関連する問題