【问题标题】:Override ModelViewSet's queryset with filter backends applied使用过滤器后端覆盖 ModelViewSet 的查询集
【发布时间】:2017-02-12 10:36:37
【问题描述】:

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

我应该如何实现这个?

Django:1.10

Django Rest 框架:3.4.6

【问题讨论】:

  • @e4c5 所以你的意思是,如果我想在get_queryset() 中使用它,我必须复制我在CustomFilter 中已有的所有过滤?
  • 抱歉没有密切关注。除了骑filter_backends之外,你还想做什么?

标签: python django python-3.x django-rest-framework


【解决方案1】:

是的,你可以。只需扩展 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 的动作方法中它实际上是这样做的

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

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

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 2018-11-27
    • 2021-04-18
    • 2019-07-29
    相关资源
    最近更新 更多