from django_filters import rest_framework as drf_filters
import copy
class NestedFilter:
def __init__(self, filterset, name, prefix=''):
self.filterset = filterset
self.name = name
self.prefix = prefix
def iter_filters(self):
for name, filter_ in self.filterset.get_filters().items():
yield name, copy.copy(filter_)
class NestableFilterSetMixin:
nested_filters = []
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for nested in self.nested_filters:
for name, filter_ in nested.iter_filters():
filter_.name = '{}__{}'.format(nested.name, filter_.name)
self.filters[nested.prefix + name] = filter_
class NestableDrfFilterSet(NestableFilterSetMixin, drf_filters.FilterSet):
pass