Django-filters фильтр по булеву полю с помощью DRF

Я следую учебнику здесь: https://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend (в частности, раздел django-filter-backend)

и я не могу заставить это работать. Моя цель - получить список "контейнеров", у которых поле "in_use" установлено в True, но он продолжает возвращать все записи в таблице. Я не могу понять, чего мне не хватает. Я добавил django-filters в список установленных приложений, а также добавил это в блок REST_FRAMEWORK: 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']

Это конечная точка API, которую я пытаюсь найти в postman: http://127.0.0.1:8000/displaydata/containers?in_use=True. Я пробовал передавать как 'True' и 'true', так и 0s и 1s.

views.py

class ContainerViews(APIView):
    def get(self, request, id=None):
        if id:
            container = Container.objects.get(id=id)
            serializer = ContainerSerializer(container)
            return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)
        else:
            containers = Container.objects.all()
            serializer = ContainerSerializer(containers, many=True)
            filter_backends = [DjangoFilterBackend]
            filterset_fields = ['in_use']
            return Response({"status": "success", "data": serializer.data}, status=status.HTTP_200_OK)

Вам нужно передать queryset и filter_backends как атрибуты класса, вот так

class ProductList(generics.ListAPIView):
    queryset = Container.objects.all()
    serializer_class = ContainerSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['in_use']

Это представление обслуживает только запросы 'list' (много моделей). Если вы хотите также обслуживать запросы 'get' (одна модель по ID), вам нужно ReadOnlyModelViewSet

class ProductViewSet(ReadOnlyModelViewSet):
    queryset = Container.objects.all()
    serializer_class = ContainerSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['in_use']

Вы можете использовать его в urls.py следующим образом

router = DefaultRouter()
router.register("product", ProductViewSet)
urlpatterns = [
    path("", include(router.urls)),
    ...
]
Вернуться на верх