Search code examples
djangodjango-rest-frameworkdjango-filter

DRF required search filter


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?


Solution

  • 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']