【问题标题】:How to use normal Filter together with SearchFilter on Django Rest Framework?如何在 Django Rest Framework 上将普通过滤器与 SearchFilter 一起使用?
【发布时间】:2017-03-18 00:14:15
【问题描述】:

我正在使用 DRF(Django Rest 框架)。

我声明了一个 ModelViewSet,现在我想在上面添加过滤器。

class GoodsViewSet(viewsets.ModelViewSet):
    class Filter(FilterSet):    
        class Meta:
            model = m.Goods

    filter_class = Filter
    filter_backends = (SearchFilter, Filter)
    search_fields = ['name',]
    queryset = m.Goods.objects.all()
    serializer_class = s.GoodsSerializer

看到我声明了一个 Filter 子类并应用它:

filter_class = Filter

在我添加行之前,它在一开始就起作用了:

filter_backends = (SearchFilter, Filter)
search_fields = ['name',]

the doc 说的。

现在应用了搜索过滤器,而普通的filter_class 被跳过了。

一句话,他们不能一起工作。

如何解决这个问题?

【问题讨论】:

  • 将您的 filter_class 重命名为其他类名?前任。 filter_class= My_Custom_Filter
  • @soupboy 谢谢,不是那个问题。我已经制定了解决方案并作为答案发布。我只想在这里发布答案。
  • @AlfredHuang 你有关于这个问题的博客吗?我想看到完整的实施。我仍然很难弄清楚。你的解决方案很有趣。

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


【解决方案1】:

这对我有用:

    from django_filters import rest_framework as filters
    from django_filters.rest_framework import DjangoFilterBackend
    from rest_framework.filters import SearchFilter, OrderingFilter

--------views.py-----------------------------

    filter_backends = (filters.DjangoFilterBackend, SearchFilter ,OrderingFilter)
    filter_fields =('completed',)
    ordering =('-date_created',)
    search_fields =('task_name',)

【讨论】:

    【解决方案2】:

    最后,我发现我们应该同时指定两个filter_backends

    from rest_framework.filters import SearchFilter
    from django_filters.rest_framework import DjangoFilterBackend
    
    class GoodsViewSet(viewsets.ModelViewSet):
        class Filter(FilterSet):    
            class Meta:
                model = m.Goods
    
        filter_class = Filter
        filter_backends = (SearchFilter, DjangoFilterBackend)
        search_fields = ['name',]
        queryset = m.Goods.objects.all()
        serializer_class = s.GoodsSerializer
    

    或者我们可以忽略特定ViewSet 类上的filter_backends 字段,但在settings.py 中全局应用它们:

    REST_FRAMEWORK = {
        # ... other configurations
        'DEFAULT_FILTER_BACKENDS': (
            'rest_framework.filters.SearchFilter',
            'django_filters.rest_framework.DjangoFilterBackend',
        ),
    }
    

    这样filter_classsearch_fields 选项在 ViewSet 上同时可用。

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 2017-05-03
      • 2014-12-08
      • 2015-03-29
      • 2012-08-02
      • 2018-02-02
      • 2018-03-23
      • 2019-02-12
      • 2016-08-27
      相关资源
      最近更新 更多