首页 > 解决方案 > DRF 3.7 autogen 文档中的条件过滤器集:我可以为路由添加查询参数过滤器(但仅适用于某些 HTTP 动词)

问题描述

(DRF v3.7,django-filters v1.1.0)

你好!我有一个有效的 FilterSet 可以让我通过查询参数过滤我的结果,例如http://localhost:9000/mymodel?name=FooOnly

这工作得很好。

class MyNameFilter(FilterSet):
    name = CharFilter(field_name='name', help_text='Filter by name')

    class Meta:
        model = MyModel
        fields = ('name',)


class MyModel(...):
    ...
    filter_backends = (DjangoFilterBackend,)
    filter_class = MyNameFilter

但是当我为我的 API 呈现内置的自动生成的文档时,我看到这个查询参数记录在我的路由中的所有方法中,例如GET, PUT,PATCH等。

我只打算通过此查询参数过滤其中一些 HTTP 动词,因为它对其他人没有意义,例如PUT

有没有一种以这种方式使我的 FilterSet 有条件的好方法?以路由方法为条件。

我尝试在路由器级别应用此逻辑(一个错误的想法)。同样在 ViewSet 级别 - 但没有get_filter_class与例如相同的覆盖方法get_serializer_class

谢谢您的帮助。

标签: django-rest-frameworkdjango-filter

解决方案


你会进去get_filter_classDjangoFilterBackend。您需要创建一个FilterBackend覆盖该方法的新filter_queryset方法。

class GETFilterBackend(DjangoFilterBackend):

    def filter_queryset(self, request, queryset, view):
        if request.method == 'GET':
            return super().filter_queryset(request, queryset, view)
        return queryset


class MyModel(...):
    ...
    filter_backends = (GETFilterBackend,)
    filter_class = MyNameFilter

推荐阅读