Django Rest Framework фильтрация поля с null и несколькими значениями

Я использую Django Rest Framework и хочу фильтровать набор запросов в представлении на основе имени определенного поля.

Значениями фильтра будут null и дополнительно любое другое конкретное значение для поля blog_category, которое является значением ForeignKey. Таким образом, запрос фильтра должен быть на двух параметрах запроса

class Blog(ListCreateAPIView):
    permission_classes = [DjangoCustomModelPermissions]
    queryset = Blog.objects.all().select_related("blog_category")
    serializer_class = Blog_Serializer
    pagination_class = CustomPageNumberPagination
    filterset_fields = {'blog_category': ['isnull', 'exact', 'in']}

Я добавил поля поиска isnull для фильтрации нулевых значений

Я пробовал следующие запросы url, но они не работают

/blog/?blog_catgeory__in=1,null
/blog/?blog_catgeory__in=1,isnull
/blog/?blog_catgeory__in=1,isnull=true
/blog/?blog_catgeory__in=1&blog_category__isnull=true

Как мне заставить это работать?

Не всегда уместно напрямую сопоставлять фильтр с типом поля модели, поскольку некоторые виды поиска ожидают различные типы значений. Это часто встречающаяся проблема при поиске in, range и isnull.

Хотя базовым типом столбца для category является integer, при поиске isnull ожидается значение boolean.

Вы можете проверить в Несовпадение выражений фильтра и поиска (in, range, isnull)

Вышеуказанная проблема может быть решена путем переопределения метода фильтра

from django.db.models import Q
from django_filters import rest_framework as filters
from django_filters import CharFilter

class BlogFilter(filters.FilterSet):
    blog_category = CharFilter(field_name='blog_category_mast',
                               lookup_expr='exact',method='include_null')

    def include_null(self, queryset, name, value):
        return queryset.filter(
            Q(**{f'{name}__isnull': True}) | Q(**{name: value})
        )


class Blog(ListCreateAPIView):
    permission_classes = [DjangoCustomModelPermissions]
    queryset = Blog.objects.all().select_related("blog_category")
    serializer_class = Blog_Serializer
    pagination_class = CustomPageNumberPagination
    filterset_class = BlogFilter

Вернуться на верх