Skip to content

__all__ doesn't work on second query #81

Closed
@mjschultz

Description

@mjschultz

It seems like this test case should pass:

diff --git a/tests/test_backends.py b/tests/test_backends.py
index 1394e3a..88fb8d3 100644
--- a/tests/test_backends.py
+++ b/tests/test_backends.py
@@ -16,3 +16,14 @@ class BackendTest(APITestCase):

         self.assertEqual(len(response.data), 1)
         self.assertEqual(response.data[0]['username'], 'user1')
+
+    def test_django_filter_compatibility_twice(self):
+        response = self.client.get('/dffield-users/', {'username': 'user1'}, content_type='json')
+
+        self.assertEqual(len(response.data), 1)
+        self.assertEqual(response.data[0]['username'], 'user1')
+
+        response = self.client.get('/dffield-users/', {'username': 'user1'}, content_type='json')
+
+        self.assertEqual(len(response.data), 1)
+        self.assertEqual(response.data[0]['username'], 'user1')
diff --git a/tests/testapp/urls.py b/tests/testapp/urls.py
index 23e87ba..5f7b405 100644
--- a/tests/testapp/urls.py
+++ b/tests/testapp/urls.py
@@ -7,6 +7,7 @@ from . import views

 router = routers.DefaultRouter()
 router.register(r'df-users', views.DFUserViewSet, base_name='df-users')
+router.register(r'dffield-users', views.DFFieldUserViewSet, base_name='dffield-users')
 router.register(r'users', views.UserViewSet,)
 router.register(r'notes', views.NoteViewSet,)

diff --git a/tests/testapp/views.py b/tests/testapp/views.py
index 7e3956f..75761a0 100644
--- a/tests/testapp/views.py
+++ b/tests/testapp/views.py
@@ -16,6 +16,17 @@ class DFUserViewSet(viewsets.ModelViewSet):
     filter_class = DFUserFilter


+class DFFieldUserViewSet(viewsets.ModelViewSet):
+    # used to test compatibility with the drf-filters backend
+    # with standard django-filter FilterSets.
+    queryset = User.objects.all()
+    serializer_class = UserSerializer
+    filter_backends = (backends.DjangoFilterBackend, )
+    filter_fields = {
+        'username': '__all__'
+    }
+
+
 class UserViewSet(viewsets.ModelViewSet):
     queryset = User.objects.all()
     serializer_class = UserSerializer

But it fails on the second get. It looks like the generation of fields runs through and deletes the Meta.fields which is a reference to the underlying filter_fields which are then deleted.

On the second API call, the get_filter_class will return None because there are no filter_fields or filter_class causing no filtering to be applied.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions