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)
您需要像这样将 queryset
和 filter_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)),
...
]
我正在学习 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)
您需要像这样将 queryset
和 filter_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)),
...
]