Skip to content

Bugfix/1398 #1778

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 19, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion rest_framework/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def get_filter_class(self, view, queryset=None):
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)

Expand Down
19 changes: 12 additions & 7 deletions tests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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()
26 changes: 25 additions & 1 deletion tests/test_filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
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()
Expand Down Expand Up @@ -55,6 +55,18 @@ class FilterClassDetailView(generics.RetrieveAPIView):
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:
Expand Down Expand Up @@ -225,6 +237,18 @@ def test_incorrectly_configured_filter(self):
request = factory.get('/')
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):
"""
Expand Down
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