Django Rest Framework 过滤器后端和过滤器 class

Django Rest Framework filter backend and filter class

我的用户端点使用各种 FilterBackends 工作正常。我正在尝试添加一个新过滤器,以便能够传入诸如 ?ids=1,5,7 之类的 ID 列表并仅返回那些用户。

我找到了以下过滤器,它实现了这一点,但随后破坏了我的其他过滤器:

class ListFilter(Filter):
    def filter(self, qs, value):
        if not value:
            return qs

        self.lookup_type = 'in'
        values = value.split(',')
        return super(ListFilter, self).filter(qs, values)


class UserListFilter(FilterSet):
    ids = ListFilter(name='id')

    class Meta:
        model = get_user_model()
        fields = ['ids']


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = (SearchFilter, DjangoFilterBackend, OrderingFilter, InterestsFilter)
    filter_fields = ('username', 'native_language', 'country', 'interests',)
    ordering_fields = ('username',)
    search_fields = ('first_name', 'last_name')
    filter_class = UserListFilter

在添加这个自定义 filter_class 之前,所有的过滤器后端都工作正常,但是在添加 filter_class 之后,它破坏了它们,但我可以通过 ID 列表进行过滤.

filtering docs 中,他们给出了一个同时使用后端和过滤器的示例,所以我认为这应该可行,但我的代码有问题。有什么想法吗?

可以覆盖get_queryset方法,实现ids过滤的功能。

def get_queryset(self):
    ids = self.request.query_params.get('ids') # List of ids
    if ids:
        return User.objects.all().filter(id__in=ids) # returned queryset filtered by ids
    return User.objects.all() # return whole queryset