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

标签 python django django-rest-framework

我必须重写 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()

关于python - Django Rest Framework ViewSet 在覆盖 list() 方法时丢失分页、SearchFilter 和 OrderingFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50878730/

相关文章:

python - Django 条目归档

python - Django 1.9 FormView永远无法到达get_context_data

django - 如何重用 Django 模板?

python - djangorest_framework自定义异常错误

django - ModelSerializer.update() 和 ModelViewSet.update() 之间的区别

python - 如何使用 postman 从 Django Rest Framework 获取 token

python - PEP128 连续行缩进不足,以便 Vim 的视觉缩进?

python - VATIC 注释工具安装 - "turkic setup --database"- 未知操作设置

python - 计算 CFD 网格中点之间的距离

python - 如何复制 email.message.Message 对象?