Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将kwarg传递给筛选器,获取错误对象是不可调用的_Python_Django_Django Rest Framework - Fatal编程技术网

Python 如何将kwarg传递给筛选器,获取错误对象是不可调用的

Python 如何将kwarg传递给筛选器,获取错误对象是不可调用的,python,django,django-rest-framework,Python,Django,Django Rest Framework,在Django Rest框架中,希望从我的视图中将kwarg传递给我的ClubFilter类 class ClubView(ListCreateView): queryset = Club.objects.all() serializer_class = ClubSerializer filter_backends = (DjangoFilterBackend,) filter_class = ClubFilter def list(self, re

在Django Rest框架中,希望从我的视图中将
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\u class=ClubFilter(**kwargs)
添加到列表方法中,但我得到了错误:

'ClubFilter'对象不可调用


如何将kwarg从视图传递到过滤器?

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

过滤器.py
并使用它代替DjangoFilterBackend

您可以创建自定义筛选器后端

过滤器.py
用它代替DjangoFilterBackend

filter\u类
必须是类,不能是类实例。所以在创建过滤器对象时必须传递该变量

过滤器对象的创建是在过滤器后端完成的,所以您应该对过滤器后端进行子类化,并在其中提供一些方法,这些方法可以接受您的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\u filter\u kwargs
,该方法将返回所有应该传递到filter类中的kwargs。记住还要传递kwarg中为该方法提供的queryset。

filter\u 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\u filter\u kwargs
,该方法将返回所有应该传递到filter类中的kwargs。记住还要传递kwarg中为该方法提供的queryset。

您必须从查询参数或post数据中获取数据。例如,重写get_queryset()并检查请求对象以查找您期望的数据。@TheLoverter4865这与我从何处获取数据无关,假设我有,这是我如何将
kwargs
传递到过滤器。您必须从查询参数或post数据中获取数据。例如,重写get_queryset()并检查请求对象,以查找您期望的数据。@TheLoverter4865这与我从何处获取数据无关,假设我有,这是我如何将
kwargs
传递到过滤器我看到,DjangoFilterBackend实际上是从视图中读取方法,所以我们可以告诉它读取新方法,很好!我明白了,所以DjangoFilterBackend实际上从视图中读取方法,这样我们就可以告诉它读取新方法,很好!