From b8b0fc49731e76d1ac5520f1e25fb582b576d13e Mon Sep 17 00:00:00 2001 From: MItko Masarliev Date: Tue, 9 Jan 2024 15:23:50 +0200 Subject: [PATCH 1/2] add view in context --- rest_framework/filters.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 065e72f94a..91b7a79003 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -312,7 +312,9 @@ def get_valid_fields(self, queryset, view, context={}): return valid_fields def remove_invalid_fields(self, queryset, fields, view, request): - valid_fields = [item[0] for item in self.get_valid_fields(queryset, view, {'request': request})] + valid_fields = [ + item[0] for item in self.get_valid_fields(queryset, view, {'request': request, "view": view}) + ] def term_valid(term): if term.startswith("-"): From 5dbeb2f8914d9acfc935d9630138cddae54f2ad7 Mon Sep 17 00:00:00 2001 From: MItko Masarliev Date: Mon, 15 Jan 2024 13:28:03 +0200 Subject: [PATCH 2/2] add some tests --- tests/test_filters.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_filters.py b/tests/test_filters.py index 6db0c3deb2..7370e4567d 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -848,6 +848,28 @@ class OrderingListView(generics.ListAPIView): with self.assertRaises(ImproperlyConfigured): view(request) + def test_context_has_view_in_serializer(self): + class ExampleSerializer(serializers.ModelSerializer): + class Meta: + model = OrderingFilterModel + fields = ('id', 'title', 'text') + + def get_field_names(self, declared_fields, info): + view_is_instance = isinstance(self.context['view'], OrderingListView) + fields = super().get_field_names(declared_fields, info) + return [x for x in fields if x not in ['title']] if view_is_instance else fields + + class OrderingListView(generics.ListAPIView): + queryset = OrderingFilterModel.objects.all() + filter_backends = (filters.OrderingFilter,) + serializer_class = ExampleSerializer + + view = OrderingListView.as_view() + request = factory.get('/', {'ordering': 'id'}) + response = view(request) + assert not {'title'}.issubset(set(response.data[0].keys())) + assert {'id', 'text'}.issubset(set(response.data[0].keys())) + class SensitiveOrderingFilterModel(models.Model): username = models.CharField(max_length=20)