Django 5 для начинающих

Прогресс по курсу:  9/1004

8.5 Фильтрация, поиск
5 из 5 шагов пройдено

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)

  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

поиск не работает, при вводе 

title в поиске ничего нет (((

@No_Name, ничего не понятно ((((

тут мы искали по body

class PostList(generics.ListCreateAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['author']
search_fields = ['body']


я изменил чтобы искали по title все заработало но опять же что это код который я закоментировал он зачем нам и куда он идет?
я то могу разобраться но мне лень это делать, пожалуйста поправьте лекцию

# 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)


class PostList(generics.ListCreateAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_fields = ['author']
    search_fields = ['title']

эта часть лекции не понятна добавлять это в код или нет?

 

По умолчанию параметр поиска называется 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)

@No_Name, Ну там же написано:

Например, следующий подкласс будет искать только по title, если в запросе присутствует параметр запроса title_only:

Это добавлено в качестве примера, как можно переопределить класс, чтобы можно было использовать поиск на основе фильтров.

Почему-то модальное окно осталось таким же, поле поиска не появилось:

@Марат_Асылбаев, А в PostList добавили следующий код?

    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_fields = ['author']
    search_fields = ['body']

Если да, то можете прислать свой проект мне на почту perminoff-ilya@yandex.ru, посмотрю и смогу дать ответ.