Skip to content

Commit 500a726

Browse files
author
Ryan P Kilby
committed
RelatedFilter.get_filter_subset => FilterSet.get_subset
1 parent 58e1441 commit 500a726

File tree

3 files changed

+23
-25
lines changed

3 files changed

+23
-25
lines changed

rest_framework_filters/filters.py

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import absolute_import
22
from __future__ import unicode_literals
33

4-
from collections import OrderedDict
54
from django.utils import six
65

76
from django_filters.filters import *
@@ -36,27 +35,6 @@ def fset(self, value):
3635
return locals()
3736
filterset = property(**filterset())
3837

39-
def get_filterset_subset(self, filter_names):
40-
"""
41-
Returns a FilterSet subclass that contains the subset of filters
42-
specified in `filter_names`. This is useful for creating FilterSets
43-
used across relationships, as it minimizes the deepcopy overhead
44-
incurred when instantiating the FilterSet.
45-
"""
46-
BaseFilterSet = self.filterset
47-
48-
class FilterSetSubset(BaseFilterSet):
49-
pass
50-
51-
FilterSetSubset.__name__ = str('%sSubset' % (BaseFilterSet.__name__))
52-
FilterSetSubset.base_filters = OrderedDict([
53-
(name, f)
54-
for name, f in six.iteritems(BaseFilterSet.base_filters)
55-
if name in filter_names
56-
])
57-
58-
return FilterSetSubset
59-
6038
@property
6139
def field(self):
6240
# if no queryset is provided, default to the filterset's default queryset

rest_framework_filters/filterset.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def get_filters(self):
129129

130130
# otherwise build and insert it into the cache
131131
if subset_class is None:
132-
subset_class = related_filter.get_filterset_subset(filter_names)
132+
subset_class = related_filter.filterset.get_subset(filter_names)
133133
self.cache_set(key, subset_class)
134134

135135
# initialize and copy filters
@@ -162,6 +162,26 @@ def get_filter_name(cls, param):
162162
if isinstance(f, filters.RelatedFilter):
163163
return related_param
164164

165+
@classmethod
166+
def get_subset(cls, filter_names):
167+
"""
168+
Returns a FilterSet subclass that contains the subset of filters
169+
specified in `filter_names`. This is useful for creating FilterSets
170+
used across relationships, as it minimizes the deepcopy overhead
171+
incurred when instantiating the FilterSet.
172+
"""
173+
class FilterSetSubset(cls):
174+
pass
175+
176+
FilterSetSubset.__name__ = str('%sSubset' % (cls.__name__))
177+
FilterSetSubset.base_filters = OrderedDict([
178+
(name, f)
179+
for name, f in six.iteritems(cls.base_filters)
180+
if name in filter_names
181+
])
182+
183+
return FilterSetSubset
184+
165185
def cache_key(self, filterset, filter_names):
166186
return '%sSubset-%s' % (filterset.__name__, '-'.join(sorted(filter_names)), )
167187

tests/test_filterset.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,9 @@ def test_m2m_relation(self):
304304
titles = set([p.title for p in f])
305305
self.assertEqual(titles, set(["First post", "Second post"]))
306306

307-
def test_get_filterset_subset(self):
307+
def test_get_subset(self):
308308
related_filter = NoteFilterWithRelated.base_filters['author']
309-
filterset_class = related_filter.get_filterset_subset(['email'])
309+
filterset_class = related_filter.filterset.get_subset(['email'])
310310

311311
# ensure that the class name is useful when debugging
312312
self.assertEqual(filterset_class.__name__, 'UserFilterSubset')

0 commit comments

Comments
 (0)