aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYamila Moreno2013-10-24 15:39:02 +0200
committerYamila Moreno2013-10-24 16:16:01 +0200
commit82e9ddcf7a5cb5fda81e84326bb6f8181ccdffab (patch)
treed634427fd7c69d1bf333cd05022e8cd9f24b237b
parent4d894fd39ec5670e72756c26908468fd743354c6 (diff)
downloaddjango-rest-framework-82e9ddcf7a5cb5fda81e84326bb6f8181ccdffab.tar.bz2
Added get_filter_backends method
-rwxr-xr-xdocs/api-guide/generic-views.md20
-rw-r--r--rest_framework/generics.py12
2 files changed, 27 insertions, 5 deletions
diff --git a/docs/api-guide/generic-views.md b/docs/api-guide/generic-views.md
index 24fc0bc7..8fedcdaa 100755
--- a/docs/api-guide/generic-views.md
+++ b/docs/api-guide/generic-views.md
@@ -121,6 +121,22 @@ For example:
Note that if your API doesn't include any object level permissions, you may optionally exclude the ``self.check_object_permissions, and simply return the object from the `get_object_or_404` lookup.
+#### `get_filter_backends(self)`
+
+Returns the classes that should be used to filter the queryset. Defaults to returning the `filter_backends` attribute.
+
+May be override to provide more complex behavior with filters, as using different (or even exlusive) lists of filter_backends depending on different criteria.
+
+For example:
+
+ def get_filter_backends(self):
+ if "geo_route" in self.request.QUERY_PARAMS:
+ return (GeoRouteFilter, CategoryFilter)
+ elif "geo_point" in self.request.QUERY_PARAMS:
+ return (GeoPointFilter, CategoryFilter)
+
+ return (CategoryFilter,)
+
#### `get_serializer_class(self)`
Returns the class that should be used for the serializer. Defaults to returning the `serializer_class` attribute, or dynamically generating a serializer class if the `model` shortcut is being used.
@@ -328,7 +344,7 @@ You can then simply apply this mixin to a view or viewset anytime you need to ap
serializer_class = UserSerializer
lookup_fields = ('account', 'username')
-Using custom mixins is a good option if you have custom behavior that needs to be used
+Using custom mixins is a good option if you have custom behavior that needs to be used
## Creating custom base classes
@@ -337,7 +353,7 @@ If you are using a mixin across multiple views, you can take this a step further
class BaseRetrieveView(MultipleFieldLookupMixin,
generics.RetrieveAPIView):
pass
-
+
class BaseRetrieveUpdateDestroyView(MultipleFieldLookupMixin,
generics.RetrieveUpdateDestroyAPIView):
pass
diff --git a/rest_framework/generics.py b/rest_framework/generics.py
index 6d204cf5..7cb80a84 100644
--- a/rest_framework/generics.py
+++ b/rest_framework/generics.py
@@ -175,6 +175,14 @@ class GenericAPIView(views.APIView):
method if you want to apply the configured filtering backend to the
default queryset.
"""
+ for backend in self.get_filter_backends():
+ queryset = backend().filter_queryset(self.request, queryset, self)
+ return queryset
+
+ def get_filter_backends(self):
+ """
+ Returns the list of filter backends that this view requires.
+ """
filter_backends = self.filter_backends or []
if not filter_backends and self.filter_backend:
warnings.warn(
@@ -185,10 +193,8 @@ class GenericAPIView(views.APIView):
PendingDeprecationWarning, stacklevel=2
)
filter_backends = [self.filter_backend]
+ return filter_backends
- for backend in filter_backends:
- queryset = backend().filter_queryset(self.request, queryset, self)
- return queryset
########################
### The following methods provide default implementations