django - 无法使用基于 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 过滤器是否不适用于基于类的视图。我假设不应该是这种情况,但是我在这里哪里出错了。请帮忙
解决方案
那是因为 Django 本身没有像 Django Rest Framework 那样提供任何过滤器类/方法。
如您所见,您可以使用的一个filter_backends
是继承自APIView
Django Rest Framework 提供的,另一个是继承自viewsets.ReadOnlyModelViewSet
Django 提供的。所以不能filter_backends
申请AllBookViewSet
。
如何做到这一点?
您可以使用 2 种方法来过滤视图上的数据:
自定义
get_queryset
方法AllBookViewSet
(不推荐)。使用django-filter为基于类的视图创建过滤器后端。还有一种方法可以将这种过滤器集成到
rest_framework
的视图中。
所以试试吧。
推荐阅读
- css - 如何将两个css类优化为一个
- c++ - 为什么在生成应用程序版本时显示错误消息
- google-cloud-platform - GCP CloudRun - 添加 NAT 网关或内部服务入口全部?
- reactjs - 如何从材质 ui 更改 Slider 的气泡头中显示的内容?
- angular - Angular Unit Test - TypeError:无法读取未定义的属性“名称”
- excel - VBA 错误 运行时错误 6 '溢出',有什么问题?
- visual-studio - Visual Studio 2019“解决方案资源管理器”“查看代码”图标 C#
- python - 以相等的比例设置 matplotlib 3D 轴
- flutter - 是否可以在颤动的 TextFormField 中显示外键数据
- python - 调用 PutObject 操作时发生错误(InvalidArgument):计算的键的 MD5 哈希与提供的哈希不匹配