mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 09:57:55 +03:00 
			
		
		
		
	Added get_filter_backends method
This commit is contained in:
		
							parent
							
								
									4d894fd39e
								
							
						
					
					
						commit
						82e9ddcf7a
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user