Skip to content

Commit 75d221c

Browse files
author
Ryan P Kilby
committed
Fix #49
1 parent 0a5f4e5 commit 75d221c

File tree

4 files changed

+40
-0
lines changed

4 files changed

+40
-0
lines changed

rest_framework_filters/filterset.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ def __new__(cls, name, bases, attrs):
4343

4444
new_class.base_filters[filter_name] = f
4545

46+
elif name not in new_class.declared_filters:
47+
new_class.base_filters[name] = new_class.fix_filter_field(filter_)
48+
4649
return new_class
4750

4851

tests/filters.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,12 @@ class InSetLookupPersonNameFilter(FilterSet):
176176

177177
class Meta:
178178
model = Person
179+
180+
181+
class BlogPostOverrideFilter(FilterSet):
182+
declared_publish_date__isnull = filters.NumberFilter(name='publish_date', lookup_type='isnull')
183+
all_declared_publish_date = filters.AllLookupsFilter(name='publish_date')
184+
185+
class Meta:
186+
model = BlogPost
187+
fields = {'publish_date': filters.ALL_LOOKUPS, }

tests/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,4 @@ class BlogPost(models.Model):
5757
title = models.CharField(max_length=100)
5858
content = models.TextField()
5959
tags = models.ManyToManyField(Tag, null=True)
60+
publish_date = models.DateField(null=True)

tests/test_filterset.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from django.contrib.auth.models import User
99
from django.utils.dateparse import parse_time, parse_datetime
1010

11+
from rest_framework_filters import filters
12+
1113
from .models import (
1214
Note, Post, Cover, Page, A, B, C, Person, Tag, BlogPost,
1315
)
@@ -24,6 +26,7 @@
2426
# PageFilterWithRelated,
2527
TagFilter,
2628
BlogPostFilter,
29+
BlogPostOverrideFilter,
2730
# UserFilterWithDifferentName,
2831
NoteFilterWithRelatedDifferentName,
2932

@@ -487,6 +490,30 @@ def test_inset_char_filter(self):
487490
self.assertIn(p1, f)
488491
self.assertIn(p2, f)
489492

493+
def test_declared_filters(self):
494+
F = BlogPostOverrideFilter
495+
496+
# explicitly declared filters SHOULD NOT be overridden
497+
self.assertIsInstance(
498+
F.base_filters['declared_publish_date__isnull'],
499+
filters.NumberFilter
500+
)
501+
502+
# declared `AllLookupsFilter`s SHOULD generate filters that ARE overridden
503+
self.assertIsInstance(
504+
F.base_filters['all_declared_publish_date__isnull'],
505+
filters.BooleanFilter
506+
)
507+
508+
def test_dict_declaration(self):
509+
F = BlogPostOverrideFilter
510+
511+
# dictionary style declared filters SHOULD be overridden
512+
self.assertIsInstance(
513+
F.base_filters['publish_date__isnull'],
514+
filters.BooleanFilter
515+
)
516+
490517

491518
class FilterExclusionTests(TestCase):
492519

0 commit comments

Comments
 (0)