django-filters 使用 DRF 按布尔字段过滤

django-filters filter by Boolean field with DRF

我正在学习 this 教程,特别是 django-filter-backend 部分。

我无法让它工作。我的目标是检索“in_use”字段设置为 True 的“容器”列表,但它一直返回 table 中的所有记录。我看不到我错过了什么。我已将 django-filters 添加到我已安装的应用程序列表中,并将其添加到我的 REST_FRAMEWORK 块中:

'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']

这是我试图在 postman 中访问的 API 端点:

http://127.0.0.1:8000/displaydata/containers?in_use=True``` 我试过同时传递 'True' 和 'true',以及 0 和 1。

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)

您需要像这样将 querysetfilter_backends 作为 class 属性传递

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