【问题标题】:DRF required search filterDRF 所需的搜索过滤器
【发布时间】:2020-04-06 01:29:14
【问题描述】:

我的视图集可以正常工作

class PlayerViewSet(ModelViewSet):
     queryset = Player.objects.all()
     serializer_class = PlayerSerializer
     filter_backends = [SearchFilter]
     search_fields = ['nickname']

网址配置:

    path('player', PlayerViewSet.as_view({'get': 'list', 'post': 'create'})),

当我尝试使用以下端点搜索对象时一切正常:'player?search=randomNickname'

但有可能在没有搜索参数的情况下发送 GET 请求并返回所有可能的对象

有没有办法根据需要设置搜索字段?

【问题讨论】:

    标签: django django-rest-framework django-filter


    【解决方案1】:

    由于ModelViewSet 可以执行各种操作(获取、更新、删除......),扩展SearchFilter 并使其在没有传递搜索参数或通过错误时返回空结果可能会更好。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多