在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传递给我的过滤器?
答案 0 :(得分:2)
您可以创建自定义过滤器后端
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为该方法提供的查询集。