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