I have viewset that works fine
class PlayerViewSet(ModelViewSet):
queryset = Player.objects.all()
serializer_class = PlayerSerializer
filter_backends = [SearchFilter]
search_fields = ['nickname']
Url configuration:
path('player', PlayerViewSet.as_view({'get': 'list', 'post': 'create'})),
Everything works fine when I try search objects using endpoint like: 'player?search=randomNickname'
but there is possibility to send GET request without search parms and it returns all possible objects
Is there any way to set search field as required?
As ModelViewSet
can perform variety of actions (get, update, delete ..) it might be better to extend SearchFilter
and make it either return empty result if no search parameters passed or through an error.
from rest_framework import filters
from rest_framework.exceptions import ValidationError
class CustomSearchFilter(filters.SearchFilter):
def filter_queryset(self, request, queryset, view):
search_terms = self.get_search_terms(request)
if not search_terms:
# turn queryset in EmptyQuerySet
# so no objects will be returned
return queryset.none()
# Alternatively, an error can be raise
#raise ValidationError(
# "%s parameter is required!" % self.search_param
#)
return super().filter_queryset(request, queryset, view)
class PlayerViewSet(ModelViewSet):
queryset = Player.objects.all()
serializer_class = PlayerSerializer
filter_backends = [CustomSearchFilter]
search_fields = ['nickname']