Django SearchFilter отображает все данные, когда поле поиска пусто - PullRequest
1 голос
/ 15 февраля 2020

Я реализовал функцию поиска, используя Django SearchFilter DRF, которая отлично работает, но проблема в том, что я не хочу отображать весь запрос, когда ничего не передаю в поле поиска. По умолчанию возвращается весь запрос. Я не знаю, как с этим справиться.

views.py

    class EventSearchView(generics.ListAPIView):
          permission_classes = (AllowAny,)
          queryset = Event.objects.all()
          search_fields = ["name", "description","content"]
          filter_backends = (filters.SearchFilter,)
          serializer_class = EventSearchSerializer
          pagination_class = LargeResultsSetPagination

Когда я ищу поля «имя», «описание», это работает нормально, но когда я ничего не ищу и поразить URL без полей поиска по умолчанию, он возвращает все запросы, но я не хочу ничего отображать.

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Другой способ - использовать класс фильтра. Просто определите его где угодно.

from django_filters import rest_framework as filters

class ContentFilter(filters.FilterSet):
    name = filters.CharFilter(required=True)

    class Meta:
    model = <your_model>
    fields = ['name']

Чем вы можете добавить его в своем представлении:

filterset_class = ContentFilter

Теперь ваш параметр имени будет обязательным, и никто не сможет получить ваш запрос без него. Это лучший способ, потому что если пользователь забудет отправить параметр, он получит сообщение об ошибке, а не пустой ответ.

1 голос
/ 15 февраля 2020

Попробуйте переопределить get_queryset метод, чтобы проверить, содержит ли query_params данные или нет:

class EventSearchView(generics.ListAPIView):
    permission_classes = (AllowAny,)    
    search_fields = ["name", "description","content"]
    filter_backends = (filters.SearchFilter,)
    serializer_class = EventSearchSerializer
    pagination_class = LargeResultsSetPagination

    def get_queryset(self):
        if self.request.query_params:    
            return Event.objects.all()
    return Event.objects.none()
...