【问题标题】:why does django-filter not work as expected为什么 django-filter 不能按预期工作
【发布时间】:2020-02-22 23:19:04
【问题描述】:

我的基于类的视图有以下 views.py 文件。

from rest_framework import viewsets
from rest_framework.views import APIView
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from django.shortcuts import get_object_or_404
from .permissions import IsOwner, IsNotBlacklistedUser
from rest_framework import filters
from django_filters import rest_framework as filters_django

from core.models import Book
from .serializers import BookSerializer, AllBookSerializer


class BookApiView(APIView):
    authentication_classes = (JSONWebTokenAuthentication, )
    permission_classes = (IsAuthenticated, IsNotBlacklistedUser)
    filter_backends = (filters_django.DjangoFilterBackend,)
    filterset_fields = ('title',)

    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)

当我在 django rest 框架 UI 中加载此视图时,我看不到任何过滤器选项。我不确定我应该怎么做。有人可以指出我可能需要做些什么才能使其正常工作。我还在我的 settings.py 文件中添加了'django_filters'

提前致谢。

【问题讨论】:

标签: django-rest-framework django-filter


【解决方案1】:

您可以使用 ViewSet。

class BookApiViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
    authentication_classes = (JSONWebTokenAuthentication, )
    permission_classes = (IsAuthenticated, IsNotBlacklistedUser)
    filter_backends = (filters_django.DjangoFilterBackend,)
    filter_fields = ('title',)

或通用 APIViews

class BookListCreateAPIView(generics.ListCreateAPIView):
     authentication_classes = (JSONWebTokenAuthentication, )
     permission_classes = (IsAuthenticated, IsNotBlacklistedUser)
     filter_backends = (filters_django.DjangoFilterBackend,)
     filter_fields = ('title',)

或者您可以扩展 GenericAPIView 并手动编写过滤器。

class BookApiView(GenericAPIView):
     authentication_classes = (JSONWebTokenAuthentication, )
     permission_classes = (IsAuthenticated, IsNotBlacklistedUser)
     filter_backends = (filters_django.DjangoFilterBackend,)
     filter_fields = ('title',)
     queryset = self.filter_queryset(self.get_queryset())

     def get(self, request, *args, **kwargs):
         page = self.paginate_queryset(queryset)
         if page is not None:
             serializer = self.get_serializer(page, many=True)
             return self.get_paginated_response(serializer.data)

         serializer = self.get_serializer(queryset, many=True)
         return Response(serializer.data)

注意:我没有测试您可能需要稍微调整的代码。

【讨论】:

    猜你喜欢
    • 2018-12-16
    • 2021-05-30
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多