关于APIView的django过滤器

Ser*_*ity 4 python django django-filter django-rest-framework

我有一个APIView类显示所有的租金和发布和删除等.现在我想要搜索功能,所以我试图使用DjangoFilterBackend但它不工作.我在文档中看到它已经与ListAPIView一起使用但是我如何在APIView中使用它.

class Rent(APIView):
    """
    List all the rents if token is not provided else a token specific rent
    """
    serializer_class = RentSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('city', 'place', 'property_category',)
    search_fields = ('=city', '=place')
    def get(self, request, token=None, format=None):
        reply={}
        try:
            rents = Rental.objects.all()
            if token:
                rent = Rental.objects.get(token=token)
                reply['data'] = self.serializer_class(rent).data
            else:
                reply['data'] = self.serializer_class(rents, many=True).data
        except Rental.DoesNotExist:
            return error.RequestedResourceNotFound().as_response()
        except:
            return error.UnknownError().as_response()
        else:
            return Response(reply, status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

当我在网址中使用以下参数搜索租金时,我得到所有的租金,而我应该只获得位于加德满都市的租金并放置koteshwor

HTTP://本地主机:8000/API/V1 /租金城市=加德满都与地方= Koteshwor

Chi*_*idG 11

要使用DjangoFilterBackend的功能,您可以合并filter_queryset方法GenericViewSet,这是从DRF继承APIView并导致DRF 中所有特定"通用"视图类的DRF类.它看起来像这样:

def filter_queryset(self, queryset):
    """
    Given a queryset, filter it with whichever filter backend is in use.
    You are unlikely to want to override this method, although you may need
    to call it either from a list view, or from a custom `get_object`
    method if you want to apply the configured filtering backend to the
    default queryset.
    """
    for backend in list(self.filter_backends):
        queryset = backend().filter_queryset(self.request, queryset, self)
    return queryset
Run Code Online (Sandbox Code Playgroud)

https://github.com/encode/django-rest-framework/blob/master/rest_framework/generics.py


itz*_*nTV 9

这里如果你正在使用APIView,与过滤器无关。所以你必须像

get_data = request.query_params #or request.GET check both
Run Code Online (Sandbox Code Playgroud)

然后

Rental.objects.filter(city=get_data['city'], place=get_data['place'])
Run Code Online (Sandbox Code Playgroud)


sar*_*n3h 6

如果有人想知道我们如何django_filters filter_class与 api_views集成:

@api_view(['GET'])
@permission_classes([permissions.IsAuthenticated])
def filter_data(request, format=None):
    qs = models.YourModal.objects.all()

    filtered_data = filters.YourFilter(request.GET, queryset=qs)
    filtered_qs = filtered_data.qs
    ....
    return response.Ok(yourData)
Run Code Online (Sandbox Code Playgroud)

  • 除了在filtered_data上调用qs之外,您还可以调用is_valid()和错误进行验证:https://github.com/carltongibson/django-filter/blob/master/django_filters/filterset.py (2认同)