Skip to main content
 首页 » 编程设计

python之Django Rest Framework 在不丢失 filter_backends 功能的情况下覆盖 View 集 list() 方法

2025年05月04日35soundcode

我有一个 View 集,我覆盖了 list() 方法,但按字段过滤停止工作。如何从我的代码中调用过滤选项:

这是我的 View 集:

 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 

感谢您的帮助。

请您参考如下方法:

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) 

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