diff options
| author | Tom Christie | 2014-08-19 16:16:02 +0100 | 
|---|---|---|
| committer | Tom Christie | 2014-08-19 16:16:02 +0100 | 
| commit | 5358243ca5e35dcb28ce96175c4f8f58504513aa (patch) | |
| tree | d717e4cb77089b3190ab79c82bec1fa34e8c8c8d | |
| parent | 390061bed0991892dfa6c9b953fffc1bd15564a9 (diff) | |
| parent | 06b6b96f933088ba36d4c98e13893274f29bed6a (diff) | |
| download | django-rest-framework-5358243ca5e35dcb28ce96175c4f8f58504513aa.tar.bz2 | |
Merge pull request #1778 from linovia/bugfix/1398
Bugfix/1398
| -rw-r--r-- | rest_framework/filters.py | 2 | ||||
| -rw-r--r-- | tests/models.py | 19 | ||||
| -rw-r--r-- | tests/test_filters.py | 26 | 
3 files changed, 38 insertions, 9 deletions
| diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 538386ce..28927eec 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -44,7 +44,7 @@ class DjangoFilterBackend(BaseFilterBackend):          if filter_class:              filter_model = filter_class.Meta.model -            assert issubclass(filter_model, queryset.model), \ +            assert issubclass(queryset.model, filter_model), \                  'FilterSet model %s does not match queryset model %s' % \                  (filter_model, queryset.model) diff --git a/tests/models.py b/tests/models.py index fba3f8f7..fe064b46 100644 --- a/tests/models.py +++ b/tests/models.py @@ -60,6 +60,18 @@ class ReadOnlyManyToManyModel(RESTFrameworkModel):      rel = models.ManyToManyField(Anchor) +class BaseFilterableItem(RESTFrameworkModel): +    text = models.CharField(max_length=100) + +    class Meta: +        abstract = True + + +class FilterableItem(BaseFilterableItem): +    decimal = models.DecimalField(max_digits=4, decimal_places=2) +    date = models.DateField() + +  # Model for regression test for #285  class Comment(RESTFrameworkModel): @@ -172,10 +184,3 @@ class NullableOneToOneSource(RESTFrameworkModel):  class BasicModelSerializer(serializers.ModelSerializer):      class Meta:          model = BasicModel - - -# Models to test filters -class FilterableItem(models.Model): -    text = models.CharField(max_length=100) -    decimal = models.DecimalField(max_digits=4, decimal_places=2) -    date = models.DateField() diff --git a/tests/test_filters.py b/tests/test_filters.py index b29760fa..47bffd43 100644 --- a/tests/test_filters.py +++ b/tests/test_filters.py @@ -9,7 +9,7 @@ from django.conf.urls import patterns, url  from rest_framework import generics, serializers, status, filters  from rest_framework.compat import django_filters  from rest_framework.test import APIRequestFactory -from .models import FilterableItem, BasicModel +from .models import BaseFilterableItem, FilterableItem, BasicModel  from .utils import temporary_setting  factory = APIRequestFactory() @@ -55,6 +55,18 @@ if django_filters:          filter_class = SeveralFieldsFilter          filter_backends = (filters.DjangoFilterBackend,) +    # These classes are used to test base model filter support +    class BaseFilterableItemFilter(django_filters.FilterSet): +        text = django_filters.CharFilter() + +        class Meta: +            model = BaseFilterableItem + +    class BaseFilterableItemFilterRootView(generics.ListCreateAPIView): +        model = FilterableItem +        filter_class = BaseFilterableItemFilter +        filter_backends = (filters.DjangoFilterBackend,) +      # Regression test for #814      class FilterableItemSerializer(serializers.ModelSerializer):          class Meta: @@ -227,6 +239,18 @@ class IntegrationTestFiltering(CommonFilteringTestCase):          self.assertRaises(AssertionError, view, request)      @unittest.skipUnless(django_filters, 'django-filter not installed') +    def test_base_model_filter(self): +        """ +        The `get_filter_class` model checks should allow base model filters. +        """ +        view = BaseFilterableItemFilterRootView.as_view() + +        request = factory.get('/?text=aaa') +        response = view(request).render() +        self.assertEqual(response.status_code, status.HTTP_200_OK) +        self.assertEqual(len(response.data), 1) + +    @unittest.skipUnless(django_filters, 'django-filter not installed')      def test_unknown_filter(self):          """          GET requests with filters that aren't configured should return 200. | 
