Django Rest Framework过滤后端和过滤类

时间:2015-07-17 17:47:51

标签: django django-rest-framework

我的用户端点工作正常,有各种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中,他们使用后端和过滤器给出了一个示例,所以我认为这应该可行,但是我的代码出了问题。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您可以覆盖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