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)),
...
]