我已经使用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
尝试覆盖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()
另一种方式是使用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参数,没有它,没有人可以获取您的请求。这是更好的方法,因为如果用户忘记发送参数,他会收到错误消息,而不是空白的响应。