SearchFilter
Класс SearchFilter поддерживает простой поиск по одному параметру запроса и основан на Django admin's search functionality.
При использовании API с возможностью просмотра будет включать элемент управления SearchFilter:
Класс SearchFilter будет применяться, только если у представления установлен атрибут search_fields.
Атрибут search_fields должен представлять собой список имен полей текстового типа в модели, таких как CharField или TextField.
from rest_framework import filters
class PostList(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['author']
search_fields = ['body']
Это позволит фильтровать элементы в списке, делая такие запросы, как:
http://127.0.0.1:8000/api/?search=Django
Вы также можете выполнить связанный поиск по полю ForeignKey или ManyToManyField с помощью нотации двойного неравенства API поиска:
search_fields = ['body', 'author__username']
Для полей JSONField и HStoreField можно фильтровать на основе вложенных значений внутри структуры данных, используя ту же нотацию двойного андерскора:
search_fields = ['body', 'author__profile__bio']
По умолчанию при поиске используются частичные совпадения без учета регистра.
Параметр поиска может содержать несколько условий поиска, которые должны быть разделены пробелами и/или запятыми.
Если используется несколько условий поиска, то объекты будут возвращены в списке только в том случае, если совпадут все указанные условия.
Поведение поиска может быть ограничено путем добавления различных символов к полям_поиска:
-
^Поиск с начала.
-
=Точное совпадение.
-
@Полнотекстовый поиск. (В настоящее время поддерживается только PostgreSQL backend Django).
-
$Регексный поиск.
Например:
search_fields = ['=username', '=email']
По умолчанию параметр поиска называется search, но его можно переопределить с помощью параметра SEARCH_PARAM.
Чтобы динамически изменять поля поиска на основе содержимого запроса, можно подклассифицировать SearchFilter и переопределить функцию get_search_fields().
Например, следующий подкласс будет искать только по title, если в запросе присутствует параметр запроса title_only:
from rest_framework import filters
class CustomSearchFilter(filters.SearchFilter):
def get_search_fields(self, view, request):
if request.query_params.get('title_only'):
return ['title']
return super().get_search_fields(view, request)