Cómo pasar kwarg para filtrar, obtener un objeto de error no es recuperable

En Django Rest Framework, quiero pasar un kwarg a mi clase ClubFilter desde mi punto de vista.

 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) 

Así que intenté agregar self.filter_class = ClubFilter(**kwargs) a la lista methoud pero me sale el error:

El objeto ‘ClubFilter’ no es llamable

¿Cómo puedo pasar kwarg a mi filtro desde la vista?

filter_class debe ser una clase, no puede ser una instancia de clase. Así que debes pasar esa variable cuando se crea el objeto de filtro.

La creación del objeto de filtro se realiza en el back-end de filtro, por lo que debe crear una subclase de su backend de filtro y proporcionar algún método que pueda llevar a sus kwargs.

DjangoFilterBackend que estás usando DjangoFilterBackend . Puedes subclasificarlo así:

 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 

Eso te permitirá crear el método get_filter_kwargs dentro de tu vista, que debería devolver todos los kwargs que deberían pasarse a tu clase de filtro. Recuerde pasar también el queryset que se proporciona en kwarg para ese método.

Puede crear un backend de filtro personalizado

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 

y usarlo en su lugar DjangoFilterBackend