应用过滤器后端覆盖ModelViewSet的queryset

pri*_*moz 1 python django python-3.x django-rest-framework

是否有可能考虑到MyModelViewSetfilter_backends创建自定义的查询集什么时候?

class MyModelViewSet(viewsets.ModelViewSet):
    filter_backends = (CustomFilter, )
    serializer_class = MySerializer

    def get_queryset(self):
        # It should not return all objects, but only results from `CustomFilter`
        queryset = LedgerEntry.objects.all()
        # some extra filtering
        return queryset
Run Code Online (Sandbox Code Playgroud)

我应该如何实施呢?

的Django:1.10

Django Rest框架:3.4.6

Sar*_*iev 5

是的你可以。只是扩展filter_querysetViewSet的方法

class MyModelViewSet(viewsets.ModelViewSet):
    filter_backends = (CustomFilter, )
    serializer_class = MySerializer

    def filter_queryset(self, queryset):
        # super needs to be called to filter backends to be applied
        queryset = super().filter_queryset(queryset)
        # some extra filtering
        return queryset
Run Code Online (Sandbox Code Playgroud)

在ViewSet中的操作方法中,它实际上是这样做的

queryset = self.filter_queryset(self.get_queryset())
Run Code Online (Sandbox Code Playgroud)

因此,发送到序列化程序的查询集是由创建get_queryset并随后使用过滤的查询集filter_queryset