zenwalker
6/20/2017 - 8:06 PM

nested_filters.py

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