aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/generics.py23
-rw-r--r--rest_framework/settings.py12
2 files changed, 26 insertions, 9 deletions
diff --git a/rest_framework/generics.py b/rest_framework/generics.py
index 2bb23a89..05ec93d3 100644
--- a/rest_framework/generics.py
+++ b/rest_framework/generics.py
@@ -39,8 +39,8 @@ class GenericAPIView(views.APIView):
pagination_serializer_class = api_settings.DEFAULT_PAGINATION_SERIALIZER_CLASS
page_kwarg = 'page'
- # The filter backend class to use for queryset filtering
- filter_backend = api_settings.FILTER_BACKEND
+ # The filter backend classes to use for queryset filtering
+ filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
# The following attributes may be subject to change,
# and should be considered private API.
@@ -54,6 +54,7 @@ class GenericAPIView(views.APIView):
slug_url_kwarg = 'slug'
slug_field = 'slug'
allow_empty = True
+ filter_backend = api_settings.FILTER_BACKEND
def get_serializer_context(self):
"""
@@ -150,10 +151,20 @@ class GenericAPIView(views.APIView):
method if you want to apply the configured filtering backend to the
default queryset.
"""
- if not self.filter_backend:
- return queryset
- backend = self.filter_backend()
- return backend.filter_queryset(self.request, queryset, self)
+ filter_backends = self.filter_backends or []
+ if not filter_backends and self.filter_backend:
+ warnings.warn(
+ 'The `filter_backend` attribute and `FILTER_BACKEND` setting '
+ 'are due to be deprecated in favor of a `filter_backends` '
+ 'attribute and `DEFAULT_FILTER_BACKENDS` setting, that take '
+ 'a *list* of filter backend classes.',
+ PendingDeprecationWarning, stacklevel=2
+ )
+ filter_backends = [self.filter_backend]
+
+ for backend in filter_backends:
+ queryset = backend().filter_queryset(self.request, queryset, self)
+ return queryset
########################
### The following methods provide default implementations
diff --git a/rest_framework/settings.py b/rest_framework/settings.py
index eede0c5a..734d8478 100644
--- a/rest_framework/settings.py
+++ b/rest_framework/settings.py
@@ -29,6 +29,7 @@ from rest_framework.compat import six
USER_SETTINGS = getattr(settings, 'REST_FRAMEWORK', None)
DEFAULTS = {
+ # Base API policies
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
@@ -50,11 +51,15 @@ DEFAULTS = {
'DEFAULT_CONTENT_NEGOTIATION_CLASS':
'rest_framework.negotiation.DefaultContentNegotiation',
+
+ # Genric view behavior
'DEFAULT_MODEL_SERIALIZER_CLASS':
'rest_framework.serializers.ModelSerializer',
'DEFAULT_PAGINATION_SERIALIZER_CLASS':
'rest_framework.pagination.PaginationSerializer',
+ 'DEFAULT_FILTER_BACKENDS': (),
+ # Throttling
'DEFAULT_THROTTLE_RATES': {
'user': None,
'anon': None,
@@ -64,9 +69,6 @@ DEFAULTS = {
'PAGINATE_BY': None,
'PAGINATE_BY_PARAM': None,
- # Filtering
- 'FILTER_BACKEND': None,
-
# Authentication
'UNAUTHENTICATED_USER': 'django.contrib.auth.models.AnonymousUser',
'UNAUTHENTICATED_TOKEN': None,
@@ -95,6 +97,9 @@ DEFAULTS = {
ISO_8601,
),
'TIME_FORMAT': ISO_8601,
+
+ # Pending deprecation
+ 'FILTER_BACKEND': None,
}
@@ -108,6 +113,7 @@ IMPORT_STRINGS = (
'DEFAULT_CONTENT_NEGOTIATION_CLASS',
'DEFAULT_MODEL_SERIALIZER_CLASS',
'DEFAULT_PAGINATION_SERIALIZER_CLASS',
+ 'DEFAULT_FILTER_BACKENDS',
'FILTER_BACKEND',
'UNAUTHENTICATED_USER',
'UNAUTHENTICATED_TOKEN',