Skip to main content
 首页 » 编程设计

python之使用过滤器后端覆盖 ModelViewSet 的查询集

2025年05月04日21zhujiabin

创建自定义查询集时是否可以考虑 MyModelViewSet 的 filter_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 

我应该如何实现?

Django:1.10

Django Rest 框架:3.4.6

请您参考如下方法:

是的,你可以。只需扩展 ViewSet 的 filter_queryset 方法

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 

在 ViewSet 的 Action 方法中它实际上是这样做的

queryset = self.filter_queryset(self.get_queryset()) 

因此,发送到序列化器的查询集是由 get_queryset 创建然后用 filter_queryset 过滤的查询集