Skip to main content
 首页 » 编程设计

python之Django Rest Framework ViewSet 在覆盖 list() 方法时丢失分页、SearchFilter 和 OrderingFilter

2024年09月07日32langtianya

我必须重写 DRF ViewSet 的默认 list() 方法,但是当我这样做时,所有过滤、排序和分页都停止工作。

这是 ViewSet 的代码:

class ZoneViewSet(viewsets.ModelViewSet): 
    permission_classes = (permissions.IsAuthenticated,) 
    queryset = models.Zone.objects.all() 
    serializer_class = serializers.ZoneSerializer 
    filter_backends = (SearchFilter, OrderingFilter,) 
    search_fields = ('city', 'name') 
 
    def list(self, serializer, pk=None): 
        if pk: 
            queryset = models.Zone.objects.filter(city=pk) 
        else: 
            queryset = models.Zone.objects.all() 
        serializer = serializers.ZoneSerializer(queryset, many=True, context={'request':self.request}) 
        return Response(serializer.data) 

如何在不丢失此功能的情况下覆盖 list() 方法?

请您参考如下方法:

默认 list() 方法实现了所有这些功能。因此,不要覆盖 list,而是尝试覆盖 get_queryset() 方法。您可以使用 self.kwargs['pk'] 获取 pk 值:

class ZoneViewSet(viewsets.ModelViewSet): 
    permission_classes = (permissions.IsAuthenticated,) 
    queryset = models.Zone.objects.all() 
    serializer_class = serializers.ZoneSerializer 
    filter_backends = (SearchFilter, OrderingFilter,) 
    search_fields = ('city', 'name') 
 
    def get_queryset(self): 
        pk = self.kwargs['pk'] 
        if pk: 
            queryset = models.Zone.objects.filter(city=pk) 
        else: 
            queryset = models.Zone.objects.all()