如何将kwarg传递给Filter,获取Error对象不可调用

时间:2015-09-17 13:34:57

标签: python django django-rest-framework

在Django Rest Framework中,我希望从我的视图中将kwarg传递给我的ClubFilter课程。

class ClubView(ListCreateView):

    queryset = Club.objects.all()
    serializer_class = ClubSerializer

    filter_backends = (DjangoFilterBackend,)
    filter_class = ClubFilter

    def list(self, request, *args, **kwargs):

        queryset = self.filter_queryset(self.get_queryset())

        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

所以我尝试将self.filter_class = ClubFilter(**kwargs)添加到列表中,但我收到错误:

'ClubFilter'对象无法调用

如何从视图中将kwarg传递给我的过滤器?

2 个答案:

答案 0 :(得分:2)

您可以创建自定义过滤器后端

filters.py

class MyFilterBackend(DjangoFilterBackend):
    def filter_queryset(self, request, queryset, view):
        filter_class = self.get_filter_class(view, queryset)

        if filter_class:
            return filter_class(request.query_params, queryset=queryset, **kwargs).qs

    return queryset

并使用它代替DjangoFilterBackend

答案 1 :(得分:2)

filter_class必须是一个类,它不能是类实例。因此,在创建过滤器对象时必须传递该变量。

过滤器对象的创建是在过滤器后端完成的,因此您应该对过滤器后端进行子类化,并在其中提供一些可以使用kwargs的方法。

我假设你正在使用DjangoFilterBackend。然后你可以像这样对它进行子类化:

class MyFilterBackend(DjangoFilterBackend):

    def filter_queryset(self, request, queryset, view):
        filter_class = self.get_filter_class(view, queryset)o

        if filter_class:

            if hasattr(view, 'get_filter_kwargs'):
                filter_kwargs = view.get_filter_kwargs(queryset=queryset)
            else:
                filter_kwargs = {'queryset': queryset}

            return filter_class(request.query_params, **filter_kwargs).qs

        return None

这将允许您在视图中创建方法get_filter_kwargs,该方法应该返回所有传递给您的过滤器类的kwargs。请记住也传递kwarg为该方法提供的查询集。