Search code examples
pythondjangodjango-rest-frameworkdjango-filter

How to filter isnull False value in Django-filters?


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']

Solution

  • 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']