0

オブジェクト内のFKと呼ばれる2つのフィルタを組み合わせようとしていますが、間違ったデータが重複しています。私のテストケースでは、私は4つのレコードオブジェクトを作成し、私は彼らにはActiveStateし、ユーザーを追加たとえばDjango RESTフレームワーク:2つのクエリーセットを結合するにはどうすればよいですか?

class RecordFilter(df.FilterSet): 
    user = df.CharFilter(name='active_states__user', method='filter_user') 
    activestate = df.BooleanFilter(name='active_states__is_active', method='filter_is_active') 

    class Meta: 
     model = Record 
     fields = ['type', 'group', 'user', 'activestate'] 

    def filter_user(self, queryset, _, value): 
     return queryset.filter(active_states__user_id=value) 

    def filter_is_active(self, queryset, _, value): 
     return queryset.filter(active_states__is_active=value) 

以下

はviews.pyにあるフィルタを、発表しました。

record1.set_active_states_for_users([user1.uuid], True) 
record2.set_active_states_for_users([user1.uuid], False) 
record2.set_active_states_for_users([user2.uuid], True) 
record3.set_active_states_for_users([user2.uuid], False) 

user = user2とactivestate = Trueに対してこれらのフィルタをテストしようとしました。 そして私は取得しています。なぜならため、ユーザーのアクティブ状態=真、ユーザー= user2の

  • ワンタイムRECORD3の

    • 二回RECORD2を= user2が

    結果が唯一でなければなりませんレコード2。

    私は、chainがクエリセットの連結を行うことができることに気付きましたが、私はそれを私のviews.pyクラスRecordFilterの中でどうやって使うことができるのか分かりません。何か手掛かりはありますか?

  • +0

    'record2.set_active_states_for_users([user1.uuid]、False)'と 'activestate = True'をフィルタリングすると、なぜ結果は2になるのでしょうか? – Raz

    +0

    'user = df.CharFilter'の場合、なぜ' queryset.filter(active_states__user_id = value) 'を実行しますか?あなたの場合、 'method' argsはまったく必要ありません。フィルタロジックは、フィールド定義とメソッドに重複しています。 'name' argはfilter文のように動作します。 – Raz

    +0

    (3行目) 'record2.set_active_states_for_users([user2.uuid]、True)'で両方のフィルターをカバーする唯一のレコードであるため、結果はrecord2でなければなりません。 また、2番目のコメントでは、定義とメソッドを提出したときに重複を取得する可能性がありますか? –

    答えて

    2

    状況はhereと記載されています。このAPIを実装することができます:

    class RecordFilter(df.FilterSet): 
        active_user = df.CharFilter(method='filter_active_user') 
        disabled_user = df.CharFilter(method='filter_disabled_user') 
    
        class Meta: 
         model = Record 
         fields = ['type', 'group', 'user'] 
    
    def filter_active_user(self, queryset, name, value): 
        return queryset.filter(active_states__is_active=True, 
              active_states__user_id=value) 
    
    def filter_disabled_user(self, queryset, name, value): 
        return queryset.filter(active_states__is_active=False, 
              active_states__user_id=value) 
    

    したがって、無効になっている有効なユーザーのみをフィルタリングできます。 クエリactive_user = user2はrecord2だけを返します。

    しかし、userにはCharFilterを、active_states__user_id=valueにはフィルタクエリーセットを使用する理由はわかりません。 idが文字列でない場合は間違いのように見えます。

    +0

    ユーザーのIDが文字列であるため、ChalrFilterを使用しています。 あなたの解決策は上記の問題に対して部分的に正しいですが、タイプやグループのようなフィルタを追加したい場合、私は同じ問題を抱えますので、 'filter_active_user_group'や' filter_disabled_user_group'を実行して間違った結果を回避します。 私は、これらのクエリーセットをどのように組み合わせるかについての一般的な解決策が必要だと思います。 –

    関連する問題