Skip to content

Commit ee3cb8c

Browse files
author
Ryan P Kilby
committed
Merge pull request #86 from rpkilby/ff-reusability
Fix compatibility with backend filter_fields use
2 parents 5937ab4 + 9b3a0ea commit ee3cb8c

File tree

4 files changed

+31
-0
lines changed

4 files changed

+31
-0
lines changed

rest_framework_filters/backends.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
from copy import copy
3+
24
from django.template import loader
35
from rest_framework import compat
46
import rest_framework.filters
@@ -9,6 +11,14 @@
911
class DjangoFilterBackend(rest_framework.filters.DjangoFilterBackend):
1012
default_filter_set = FilterSet
1113

14+
def get_filter_class(self, view, queryset=None):
15+
# if creating an AutoFilterSet, copy the filter_fields as they may be
16+
# destructively modified. See issue #81.
17+
if hasattr(view, 'filter_fields'):
18+
view.filter_fields = copy(view.filter_fields)
19+
20+
return super(DjangoFilterBackend, self).get_filter_class(view, queryset)
21+
1222
def filter_queryset(self, request, queryset, view):
1323
filter_class = self.get_filter_class(view, queryset)
1424

tests/test_backends.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,14 @@ def test_django_filter_compatibility(self):
1616

1717
self.assertEqual(len(response.data), 1)
1818
self.assertEqual(response.data[0]['username'], 'user1')
19+
20+
def test_filter_fields_reusability(self):
21+
# Ensure auto-generated FilterSet is reusable w/ filter_fields. See:
22+
# https://github.com/philipn/django-rest-framework-filters/issues/81
23+
response = self.client.get('/ff-users/', {'username': 'user1'}, content_type='json')
24+
self.assertEqual(len(response.data), 1)
25+
self.assertEqual(response.data[0]['username'], 'user1')
26+
27+
response = self.client.get('/ff-users/', {'username': 'user1'}, content_type='json')
28+
self.assertEqual(len(response.data), 1)
29+
self.assertEqual(response.data[0]['username'], 'user1')

tests/testapp/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
router = routers.DefaultRouter()
99
router.register(r'df-users', views.DFUserViewSet, base_name='df-users')
10+
router.register(r'ff-users', views.FilterFieldsUserViewSet, base_name='ff-users')
1011
router.register(r'users', views.UserViewSet,)
1112
router.register(r'notes', views.NoteViewSet,)
1213

tests/testapp/views.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,15 @@ class DFUserViewSet(viewsets.ModelViewSet):
1616
filter_class = DFUserFilter
1717

1818

19+
class FilterFieldsUserViewSet(viewsets.ModelViewSet):
20+
queryset = User.objects.all()
21+
serializer_class = UserSerializer
22+
filter_backends = (backends.DjangoFilterBackend, )
23+
filter_fields = {
24+
'username': '__all__',
25+
}
26+
27+
1928
class UserViewSet(viewsets.ModelViewSet):
2029
queryset = User.objects.all()
2130
serializer_class = UserSerializer

0 commit comments

Comments
 (0)