2017-01-23 13 views
0

is_active=Trueのオブジェクトと特定のユーザーを返す次のメソッドがあります。Django RESTフレームワーク:結合されたフィルタを使用してクエリーセットを別のクエリーセットから除外します

def filter_active_user(self, queryset, name, value): 
    return queryset.filter(active_states__is_active=True, 
          active_states__user_id=value) 

私は上記の方法に含まれていないすべてのオブジェクトを含むクエリセットを返すメソッドを作成したいと考えています。だから私はexcludeを使用して、次のメソッドを作成しました:

def filter_inactive_user(self, queryset, name, value): 
    return queryset.exclude(active_states__is_active=True, 
          active_states__user_id=value) 

私も~Qを使用して次の実装を試してみました:

def filter_inactive_user(self, queryset, name, value): 
    return queryset.filter(~Q(active_states__is_active=True, 
           active_states__user_id=value)) 

しかし、私は正しい結果を得ることはありません。 たとえば、テストケースでは、3つのオブジェクトで構成されたデータをいくつか作成しました。

record_1.set_active_states_for_users([self.user1.uuid], True) 
record_2.set_active_states_for_users([self.user1.uuid], False) 
record_2.set_active_states_for_users([self.user2.uuid], True) 
record_3.set_active_states_for_users([self.user2.uuid], False) 

Iを:私は1つのオブジェクトを取得していますfilter_active_user方法を使用し、私はfilter_inactive_userメソッドを使用して他の2を得ることを期待、私は具体的にはまた1を得ていることは以下の私の試験データを発表しました私はrecord_2を得ています。filter_active_useruser=user2に使っています。 filter_inactive_useruser=user2に使用しているときは、record_1で、record_3ではありません。 クエリセットで2つのフィルタを組み合わせる適切な方法を構築するのに手伝ってもらえますか?

+0

私は何かが欠けている場合を除き、あなたは '__is_activeを行う必要がある最初のスニペットの唯一の違いではありません= False'ですか? – Sayse

+0

私は最初の試みで 'exclude'キーワードと2回目の試みで'〜Q'を使うために同じフィルターを使いました。 –

+0

「正しい結果が得られません」とさらに定義する必要があるかもしれません。(結果はどうなりますか?)フィルタで除外してfalseに設定したクエリに微妙な違いがあるかもしれません。 – Sayse

答えて

2

解決方法1:

def filter_inactive_user(self, queryset, name, value): 
    qs_active = queryset.filter(active_states__is_active=True, active_states__user_id=value) 
    qs_inactive = queryset.exclude(pk__in=qs_active.values_list('pk', flat=True)) 

解決方法2:

def filter_inactive_user(self, queryset, name, value): 
    qs_inactive = queryset.exclude(active_states__is_active=True).exclude(active_states__user_id=value) 
+0

あなたの答えは大変ありがとうございます。最初の解決策は私のために働く。 2番目の解決策は私のためには機能しません。 –

関連する問題