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
我的用户端点使用各种 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