Skip to content

Commit 5358243

Browse files
committed
Merge pull request #1778 from linovia/bugfix/1398
Bugfix/1398
2 parents 390061b + 06b6b96 commit 5358243

File tree

3 files changed

+38
-9
lines changed

3 files changed

+38
-9
lines changed

rest_framework/filters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def get_filter_class(self, view, queryset=None):
4444
if filter_class:
4545
filter_model = filter_class.Meta.model
4646

47-
assert issubclass(filter_model, queryset.model), \
47+
assert issubclass(queryset.model, filter_model), \
4848
'FilterSet model %s does not match queryset model %s' % \
4949
(filter_model, queryset.model)
5050

tests/models.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ class ReadOnlyManyToManyModel(RESTFrameworkModel):
6060
rel = models.ManyToManyField(Anchor)
6161

6262

63+
class BaseFilterableItem(RESTFrameworkModel):
64+
text = models.CharField(max_length=100)
65+
66+
class Meta:
67+
abstract = True
68+
69+
70+
class FilterableItem(BaseFilterableItem):
71+
decimal = models.DecimalField(max_digits=4, decimal_places=2)
72+
date = models.DateField()
73+
74+
6375
# Model for regression test for #285
6476

6577
class Comment(RESTFrameworkModel):
@@ -172,10 +184,3 @@ class NullableOneToOneSource(RESTFrameworkModel):
172184
class BasicModelSerializer(serializers.ModelSerializer):
173185
class Meta:
174186
model = BasicModel
175-
176-
177-
# Models to test filters
178-
class FilterableItem(models.Model):
179-
text = models.CharField(max_length=100)
180-
decimal = models.DecimalField(max_digits=4, decimal_places=2)
181-
date = models.DateField()

tests/test_filters.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from rest_framework import generics, serializers, status, filters
1010
from rest_framework.compat import django_filters
1111
from rest_framework.test import APIRequestFactory
12-
from .models import FilterableItem, BasicModel
12+
from .models import BaseFilterableItem, FilterableItem, BasicModel
1313
from .utils import temporary_setting
1414

1515
factory = APIRequestFactory()
@@ -55,6 +55,18 @@ class FilterClassDetailView(generics.RetrieveAPIView):
5555
filter_class = SeveralFieldsFilter
5656
filter_backends = (filters.DjangoFilterBackend,)
5757

58+
# These classes are used to test base model filter support
59+
class BaseFilterableItemFilter(django_filters.FilterSet):
60+
text = django_filters.CharFilter()
61+
62+
class Meta:
63+
model = BaseFilterableItem
64+
65+
class BaseFilterableItemFilterRootView(generics.ListCreateAPIView):
66+
model = FilterableItem
67+
filter_class = BaseFilterableItemFilter
68+
filter_backends = (filters.DjangoFilterBackend,)
69+
5870
# Regression test for #814
5971
class FilterableItemSerializer(serializers.ModelSerializer):
6072
class Meta:
@@ -226,6 +238,18 @@ def test_incorrectly_configured_filter(self):
226238
request = factory.get('/')
227239
self.assertRaises(AssertionError, view, request)
228240

241+
@unittest.skipUnless(django_filters, 'django-filter not installed')
242+
def test_base_model_filter(self):
243+
"""
244+
The `get_filter_class` model checks should allow base model filters.
245+
"""
246+
view = BaseFilterableItemFilterRootView.as_view()
247+
248+
request = factory.get('/?text=aaa')
249+
response = view(request).render()
250+
self.assertEqual(response.status_code, status.HTTP_200_OK)
251+
self.assertEqual(len(response.data), 1)
252+
229253
@unittest.skipUnless(django_filters, 'django-filter not installed')
230254
def test_unknown_filter(self):
231255
"""

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy