|
1 | | -from copy import deepcopy |
2 | 1 |
|
3 | 2 | import rest_framework.filters |
4 | | -from rest_framework.compat import django_filters |
5 | | - |
6 | 3 | from .filterset import FilterSet |
7 | 4 |
|
8 | 5 |
|
9 | | - |
10 | 6 | class DjangoFilterBackend(rest_framework.filters.DjangoFilterBackend): |
11 | | - """ |
12 | | - A version of `DjangoFilterBackend` that caches repeated filter classes |
13 | | - and uses our FilterSet by default. |
14 | | - """ |
15 | 7 | default_filter_set = FilterSet |
16 | | - |
17 | | - _filter_instance_cache = {} |
18 | | - |
19 | | - def _setup_filter_instance(self, _filter, query_params, queryset=None): |
20 | | - _filter.data = query_params or {} |
21 | | - _filter.is_bound = query_params is not None |
22 | | - |
23 | | - if hasattr(_filter, '_qs'): |
24 | | - del _filter._qs |
25 | | - if hasattr(_filter, '_form'): |
26 | | - del _filter._form |
27 | | - if hasattr(_filter, '_ordering_field'): |
28 | | - del _filter._ordering_field |
29 | | - |
30 | | - if queryset is None: |
31 | | - queryset = _filter._meta.model._default_manager.all() |
32 | | - _filter.queryset = queryset |
33 | | - # propagate the model being used through the filters |
34 | | - for f in _filter.filters.values(): |
35 | | - f.model = _filter._meta.model |
36 | | - |
37 | | - def filter_queryset(self, request, queryset, view): |
38 | | - filter_class = self.get_filter_class(view, queryset) |
39 | | - |
40 | | - if filter_class: |
41 | | - if filter_class in self._filter_instance_cache: |
42 | | - _filter = self._filter_instance_cache[filter_class] |
43 | | - self._setup_filter_instance(_filter, request.query_params, queryset=queryset) |
44 | | - else: |
45 | | - _filter = filter_class(request.query_params, queryset=queryset) |
46 | | - self._filter_instance_cache[filter_class] = _filter |
47 | | - |
48 | | - return _filter.qs |
49 | | - |
50 | | - return queryset |
0 commit comments