Skip to content

Commit 69b0ac5

Browse files
Merge pull request encode#5117 from rpkilby/fix-filter-backend
Fix DjangoFilterBackend mro
2 parents 36aea30 + 01ffb89 commit 69b0ac5

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Optional packages which may be used with REST framework.
22
markdown==2.6.4
33
django-guardian==1.4.8
4-
django-filter==1.0.0
4+
django-filter==1.0.2
55
coreapi==2.2.4
66
coreschema==0.0.4

rest_framework/filters.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,17 @@ def __init__(self, *args, **kwargs):
5050
DeprecationWarning
5151
)
5252
return super(FilterSet, self).__init__(*args, **kwargs)
53+
54+
DFBase = django_filters.rest_framework.DjangoFilterBackend
55+
5356
else:
5457
def FilterSet():
5558
assert False, 'django-filter must be installed to use the `FilterSet` class'
5659

60+
DFBase = BaseFilterBackend
5761

58-
class DjangoFilterBackend(BaseFilterBackend):
62+
63+
class DjangoFilterBackend(DFBase):
5964
"""
6065
A filter backend that uses django-filter.
6166
"""
@@ -69,9 +74,7 @@ def __new__(cls, *args, **kwargs):
6974
DeprecationWarning
7075
)
7176

72-
from django_filters.rest_framework import DjangoFilterBackend
73-
74-
return DjangoFilterBackend(*args, **kwargs)
77+
return super(DjangoFilterBackend, cls).__new__(cls, *args, **kwargs)
7578

7679

7780
class SearchFilter(BaseFilterBackend):

tests/test_filters.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,21 @@ class DFFilterFieldsRootView(FilterFieldsRootView):
201201
assert response.data == self.data
202202
assert len(w) == 0
203203

204+
@unittest.skipUnless(django_filters, 'django-filter not installed')
205+
def test_backend_mro(self):
206+
class CustomBackend(filters.DjangoFilterBackend):
207+
def filter_queryset(self, request, queryset, view):
208+
assert False, "custom filter_queryset should run"
209+
210+
class DFFilterFieldsRootView(FilterFieldsRootView):
211+
filter_backends = (CustomBackend,)
212+
213+
view = DFFilterFieldsRootView.as_view()
214+
request = factory.get('/')
215+
216+
with pytest.raises(AssertionError, message="custom filter_queryset should run"):
217+
view(request).render()
218+
204219
@unittest.skipUnless(django_filters, 'django-filter not installed')
205220
def test_get_filtered_fields_root_view(self):
206221
"""

0 commit comments

Comments
 (0)