django SearchFilter在搜索字段为空时显示所有数据?

问题描述 投票:1回答:2

我已经使用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
when i search for fields "name", "description" it is working fine but when i search nothing and hit the url without search fields by default it is returning all the query , but i want to display nothing , how will i achieve that, any help would be appreciated
django python-3.x django-rest-framework django-filter django-filters
2个回答
1
投票

尝试覆盖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()

0
投票

另一种方式是使用Filter类。只需在任何地方定义它即可。

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

现在将需要您的name参数,没有它,没有人可以获取您的请求。这是更好的方法,因为如果用户忘记发送参数,他会收到错误消息,而不是空白的响应。

© www.soinside.com 2019 - 2024. All rights reserved.