diff options
| author | Xavier Ordoquy | 2014-08-19 11:12:36 +0200 | 
|---|---|---|
| committer | Xavier Ordoquy | 2014-08-19 11:12:36 +0200 | 
| commit | c9535c036bc65082622ecb596e6579a43d441f4d (patch) | |
| tree | b050e8d874fa4843248a7fd00422922a5fa4700b | |
| parent | 4876bec9f529cac69aede8e51746d8a0fd6b0d88 (diff) | |
| parent | 4d45865bd73ba16801950e3f47199aa6da0f7c19 (diff) | |
| download | django-rest-framework-c9535c036bc65082622ecb596e6579a43d441f4d.tar.bz2 | |
Merged #1398 against 2.4 branch.
| -rw-r--r-- | rest_framework/filters.py | 2 | ||||
| -rw-r--r-- | tests/models.py | 12 | ||||
| -rw-r--r-- | tests/test_filters.py | 26 | 
3 files changed, 38 insertions, 2 deletions
| diff --git a/rest_framework/filters.py b/rest_framework/filters.py index 96d15eb9..57a616c2 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..e378c1cf 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): diff --git a/tests/test_filters.py b/tests/test_filters.py index 85840e01..38ddf4e4 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: @@ -226,6 +238,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. | 
