首页 > 解决方案 > 无法使用基于 Django 类的视图查看过滤器选项

问题描述

我有以下两个观点:

class BookApiView(APIView):
    filter_backends = (filters.SearchFilter,)
    search_fields = ('title',)
    authentication_classes = (JSONWebTokenAuthentication, )
    permission_classes = (IsAuthenticated, IsNotBlacklistedUser)

    def get(self, request):
        books = Book.objects.filter(
            user=request.user.id, is_published=True).order_by('-title')
        serializer = BookSerializer(books, many=True)
        return Response(serializer.data)

    def post(get, request):
        data = request.data
        serializer = BookSerializer(data=data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

class AllBookViewSet(viewsets.ReadOnlyModelViewSet):
    serializer_class = AllBookSerializer
    filter_backends = (filters.SearchFilter,)
    search_fields = ('title',)

    def get_queryset(self):
        queryset = Book.objects.all()
        title = self.request.query_params.get('title', None)
        if title is not None:
            queryset = queryset.filter(
                title__contains=title, is_published=True)
        queryset = queryset.filter(is_published=True)
        return queryset

他们都在同一个模型上工作。但是,使用一个(AllBookViewSet)我可以在 django rest 框架 UI 上看到过滤器选项,而另一个我看不到。

django 过滤器是否不适用于基于类的视图。我假设不应该是这种情况,但是我在这里哪里出错了。请帮忙

标签: djangodjango-rest-frameworkdjango-filters

解决方案


那是因为 Django 本身没有像 Django Rest Framework 那样提供任何过滤器类/方法。

如您所见,您可以使用的一个filter_backends是继承自APIViewDjango Rest Framework 提供的,另一个是继承自viewsets.ReadOnlyModelViewSetDjango 提供的。所以不能filter_backends申请AllBookViewSet

如何做到这一点?

您可以使用 2 种方法来过滤视图上的数据:

  1. 自定义get_queryset方法AllBookViewSet不推荐)。

  2. 使用django-filter为基于类的视图创建过滤器后端。还有一种方法可以将这种过滤器集成到rest_framework的视图中。

所以试试吧。


推荐阅读