From a107c295662114f2844124e243a4998ecf5005e9 Mon Sep 17 00:00:00 2001 From: DonQueso89 Date: Fri, 29 Jan 2021 14:25:51 +0100 Subject: [PATCH 1/3] only override declared filters with in lookup --- graphene_django/filter/utils.py | 39 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/graphene_django/filter/utils.py b/graphene_django/filter/utils.py index 4530599e5..013ee211b 100644 --- a/graphene_django/filter/utils.py +++ b/graphene_django/filter/utils.py @@ -79,22 +79,23 @@ def replace_csv_filters(filterset_class): """ for name, filter_field in list(filterset_class.base_filters.items()): filter_type = filter_field.lookup_expr - if filter_type in {"in", "contains", "overlap"}: - filterset_class.base_filters[name] = InFilter( - field_name=filter_field.field_name, - lookup_expr=filter_field.lookup_expr, - label=filter_field.label, - method=filter_field.method, - exclude=filter_field.exclude, - **filter_field.extra - ) - - elif filter_type == "range": - filterset_class.base_filters[name] = RangeFilter( - field_name=filter_field.field_name, - lookup_expr=filter_field.lookup_expr, - label=filter_field.label, - method=filter_field.method, - exclude=filter_field.exclude, - **filter_field.extra - ) + if name not in filterset_class.declared_filters: + if filter_type in {"in", "contains", "overlap"}: + filterset_class.base_filters[name] = InFilter( + field_name=filter_field.field_name, + lookup_expr=filter_field.lookup_expr, + label=filter_field.label, + method=filter_field.method, + exclude=filter_field.exclude, + **filter_field.extra + ) + + elif filter_type == "range": + filterset_class.base_filters[name] = RangeFilter( + field_name=filter_field.field_name, + lookup_expr=filter_field.lookup_expr, + label=filter_field.label, + method=filter_field.method, + exclude=filter_field.exclude, + **filter_field.extra + ) From c191b78e1c06644f1db63141262cc7f7ffd714a9 Mon Sep 17 00:00:00 2001 From: DonQueso89 Date: Fri, 29 Jan 2021 16:20:15 +0100 Subject: [PATCH 2/3] upd tests --- .../filter/tests/test_in_filter.py | 12 ++---- graphene_django/filter/utils.py | 41 ++++++++++--------- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/graphene_django/filter/tests/test_in_filter.py b/graphene_django/filter/tests/test_in_filter.py index 9e9c32378..712664504 100644 --- a/graphene_django/filter/tests/test_in_filter.py +++ b/graphene_django/filter/tests/test_in_filter.py @@ -33,21 +33,15 @@ class Meta: class PersonFilterSet(FilterSet): class Meta: model = Person - fields = {} - - names = filters.BaseInFilter(method="filter_names") - - def filter_names(self, qs, name, value): - return qs.filter(name__in=value) - + fields = {"name": ["in"]} + class PersonNode(DjangoObjectType): class Meta: model = Person interfaces = (Node,) filterset_class = PersonFilterSet - class Query(ObjectType): pets = DjangoFilterConnectionField(PetNode) people = DjangoFilterConnectionField(PersonNode) @@ -92,7 +86,7 @@ def test_string_in_filter_with_filterset_class(): query = """ query { - people (names: ["John", "Michael"]) { + people (name_In: ["John", "Michael"]) { edges { node { name diff --git a/graphene_django/filter/utils.py b/graphene_django/filter/utils.py index 013ee211b..0737432eb 100644 --- a/graphene_django/filter/utils.py +++ b/graphene_django/filter/utils.py @@ -79,23 +79,24 @@ def replace_csv_filters(filterset_class): """ for name, filter_field in list(filterset_class.base_filters.items()): filter_type = filter_field.lookup_expr - if name not in filterset_class.declared_filters: - if filter_type in {"in", "contains", "overlap"}: - filterset_class.base_filters[name] = InFilter( - field_name=filter_field.field_name, - lookup_expr=filter_field.lookup_expr, - label=filter_field.label, - method=filter_field.method, - exclude=filter_field.exclude, - **filter_field.extra - ) - - elif filter_type == "range": - filterset_class.base_filters[name] = RangeFilter( - field_name=filter_field.field_name, - lookup_expr=filter_field.lookup_expr, - label=filter_field.label, - method=filter_field.method, - exclude=filter_field.exclude, - **filter_field.extra - ) + if name in filterset_class.declared_filters: + continue + if filter_type in {"in", "contains", "overlap"}: + filterset_class.base_filters[name] = InFilter( + field_name=filter_field.field_name, + lookup_expr=filter_field.lookup_expr, + label=filter_field.label, + method=filter_field.method, + exclude=filter_field.exclude, + **filter_field.extra + ) + + elif filter_type == "range": + filterset_class.base_filters[name] = RangeFilter( + field_name=filter_field.field_name, + lookup_expr=filter_field.lookup_expr, + label=filter_field.label, + method=filter_field.method, + exclude=filter_field.exclude, + **filter_field.extra + ) From 3e11ae052d01f86ca0033026c51c588b3efaebd3 Mon Sep 17 00:00:00 2001 From: DonQueso89 Date: Fri, 29 Jan 2021 16:20:39 +0100 Subject: [PATCH 3/3] format --- graphene_django/filter/tests/test_in_filter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graphene_django/filter/tests/test_in_filter.py b/graphene_django/filter/tests/test_in_filter.py index 712664504..ac3dddd38 100644 --- a/graphene_django/filter/tests/test_in_filter.py +++ b/graphene_django/filter/tests/test_in_filter.py @@ -35,13 +35,14 @@ class Meta: model = Person fields = {"name": ["in"]} - + class PersonNode(DjangoObjectType): class Meta: model = Person interfaces = (Node,) filterset_class = PersonFilterSet + class Query(ObjectType): pets = DjangoFilterConnectionField(PetNode) people = DjangoFilterConnectionField(PersonNode)