Python 如何将kwarg传递给筛选器,获取错误对象是不可调用的
在Django Rest框架中,希望从我的视图中将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
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实际上从视图中读取方法,这样我们就可以告诉它读取新方法,很好!