I want to only filter category which has channels__livestream__isnull=False
. The Queryset is working fine with this paremter but the Django-filters
getting error TypeError: 'FilterSetMetaclass' object is not iterable
.
filters.py
class CategoryFilterSet(django_filters.FilterSet):
has_live_stream = django_filters.BooleanFilter(
field_name='channels__livestream',
lookup_expr='isnull',
)
class Meta:
model = YTCategory
fields = ['has_live_stream']
views.py
class CategoryList(generics.ListAPIView):
authentication_classes = []
permission_classes = []
queryset = YTCategory.objects.active()
pagination_class = Pagination
serializer_class = CategorySerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = CategoryFilterSet
search_fields = ['id', 'name']
According to the docs for django-rest-framework (https://www.django-rest-framework.org/api-guide/filtering/#overriding-the-initial-queryset) it looks like you should be setting filterset_class
instead of filterset_fields
in your views.py:
class CategoryList(generics.ListAPIView):
authentication_classes = []
permission_classes = []
queryset = YTCategory.objects.active()
pagination_class = Pagination
serializer_class = CategorySerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_class = CategoryFilterSet # Changed from filterset_fields
search_fields = ['id', 'name']