Django Rest Framework会覆盖viewset list()方法,而不会失去filter_backends功能

HuL*_*iCa 1 python django django-rest-framework

我有一个视图集,并且我重写了list()方法,但是按字段进行的过滤停止工作。如何从代码中调用过滤选项:

这是我的观点:

 class SupplementViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = models.Product.objects.filter()
    serializer_class = serializers.SuplementSerializer
    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,)
    search_fields = ('hotel', 'name')
    filter_fields = ('id', 'hotel', 'name')

    def perform_create(self, instance):
        instance.save(product_type=models.Product.SUPPLEMENT)

    def list(self, request, pk=None):
        if pk == None:
            supplements = models.Product.objects.filter(product_type=models.Product.SUPPLEMENT)
        else:
            supplements =  models.Product.objects.get(product_type=models.Product.SUPPLEMENT, id=pk)

        page = self.paginate_queryset(supplements)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(page, many=True)
        result_set = serializer.data

        return Response(result_set)

    def get_result_set(self, supplements):
        result_set = serializers.ProductSerializer(supplements, many=True).data

        return result_set
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

Ykh*_*Ykh 5

def list(self, request, pk=None):
    if pk == None:
        supplements = models.Product.objects.filter(product_type=models.Product.SUPPLEMENT)
    else:
        supplements =  models.Product.objects.filter(product_type=models.Product.SUPPLEMENT, id=pk)

    supplements= self.filter_queryset(supplements )
    page = self.paginate_queryset(supplements)
Run Code Online (Sandbox Code Playgroud)

self.filter_queryset(queryset) 是您所需要的,但是它必须接受queryset。