Skip to content

Commit ddc1914

Browse files
author
Ryan P Kilby
committed
Fix #69
'cache' argument has already been removed, but the symptom was the same. A non drf-filters FilterSet would not have the `get_subset` method and error. This allows for compatibility.
1 parent cfbb5b3 commit ddc1914

File tree

5 files changed

+36
-9
lines changed

5 files changed

+36
-9
lines changed

rest_framework_filters/backends.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ def filter_queryset(self, request, queryset, view):
1010
filter_class = self.get_filter_class(view, queryset)
1111

1212
if filter_class:
13-
subset_class = filter_class.get_subset(request.query_params)
14-
return subset_class(request.query_params, queryset=queryset).qs
13+
if hasattr(filter_class, 'get_subset'):
14+
filter_class = filter_class.get_subset(request.query_params)
15+
return filter_class(request.query_params, queryset=queryset).qs
1516

1617
return queryset

tests/test_backends.py

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

2-
from django.test import TestCase, Client
2+
from rest_framework.test import APITestCase
33

4+
from .testapp import models
45

5-
class BackendTest(TestCase):
6-
def setUp(self):
7-
self.client = Client()
86

9-
def test_get(self):
10-
self.client.get('/notes')
7+
class BackendTest(APITestCase):
8+
9+
@classmethod
10+
def setUpTestData(cls):
11+
models.User.objects.create(username="user1", email="user1@example.org")
12+
models.User.objects.create(username="user2", email="user2@example.org")
13+
14+
def test_django_filter_compatibility(self):
15+
response = self.client.get('/df-users/', {'username': 'user1'}, content_type='json')
16+
17+
self.assertEqual(len(response.data), 1)
18+
self.assertEqual(response.data[0]['username'], 'user1')

tests/testapp/filters.py

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

2+
import django_filters
23
from rest_framework_filters import filters
34
from rest_framework_filters.filters import RelatedFilter, AllLookupsFilter
45
from rest_framework_filters.filterset import FilterSet, LOOKUP_SEP
@@ -9,6 +10,13 @@
910
)
1011

1112

13+
class DFUserFilter(django_filters.FilterSet):
14+
email = filters.CharFilter(name='email')
15+
16+
class Meta:
17+
model = User
18+
19+
1220
class NoteFilterWithAll(FilterSet):
1321
title = AllLookupsFilter(name='title')
1422

tests/testapp/urls.py

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

88

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

tests/testapp/views.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@
44

55
from .models import User, Note
66
from .serializers import UserSerializer, NoteSerializer
7-
from .filters import UserFilterWithAll, NoteFilterWithRelatedAll
7+
from .filters import DFUserFilter, UserFilterWithAll, NoteFilterWithRelatedAll
8+
9+
10+
class DFUserViewSet(viewsets.ModelViewSet):
11+
# used to test compatibility with the drf-filters backend
12+
# with standard django-filter FilterSets.
13+
queryset = User.objects.all()
14+
serializer_class = UserSerializer
15+
filter_backends = (backends.DjangoFilterBackend, )
16+
filter_class = DFUserFilter
817

918

1019
class UserViewSet(viewsets.ModelViewSet):

0 commit comments

Comments
 (0)