Django SearchFilter 在搜索字段为空时显示所有数据
Django SearchFilter is displaying all the data when the search field is empty
我已经使用 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
当我搜索字段 "name"、"description" 时,它工作正常,但是当我什么都不搜索并默认点击没有搜索字段的 url 时,它会返回所有查询,但我不想显示任何内容。
我怎样才能做到这一点?
尝试覆盖 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()
另一种方法是使用过滤器 class。只需在任何地方定义它。
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
现在您的姓名参数将是必需的,没有它没有人可以获取您的请求。
这是更好的方法,因为如果用户忘记发送参数,他会收到错误消息而不是空白响应。
我已经使用 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
当我搜索字段 "name"、"description" 时,它工作正常,但是当我什么都不搜索并默认点击没有搜索字段的 url 时,它会返回所有查询,但我不想显示任何内容。
我怎样才能做到这一点?
尝试覆盖 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()
另一种方法是使用过滤器 class。只需在任何地方定义它。
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
现在您的姓名参数将是必需的,没有它没有人可以获取您的请求。 这是更好的方法,因为如果用户忘记发送参数,他会收到错误消息而不是空白响应。