使用DRF时,是否存在可以通过ID数组过滤的通用方法? 例如,如果我想返回具有以下ID的所有图像,我会这样做:
/images/?ids=1,2,3,4
我目前的实施是执行以下操作:
# filter
class ProjectImageFilter(django_filters.FilterSet):
"""
Filter on existing fields, or defined query_params with
associated functions
"""
ids = django_filters.MethodFilter(action='id_list')
def id_list(self, queryset, value):
"""
Filter by IDs by passing in a query param of this structure
`?ids=265,263`
"""
id_list = value.split(',')
return queryset.filter(id__in=id_list)
class Meta:
model = ProjectImage
fields = ['ids',]
# viewset
class Images(viewsets.ModelViewSet):
"""
Images associated with a project
"""
serializer_class = ImageSerializer
queryset = ProjectImage.objects.all()
filter_class = ProjectImageFilter
但是,在这种情况下,ProjectImageFilter
需要指定模型(ProjectImage
)。有没有办法我可以通常定义这个过滤器,以便我可以在具有不同模型的多个ViewSets上使用它?
答案 0 :(得分:1)
没有django-filters
的一个解决方案就是super()
覆盖get_queryset
。这是一个例子:
class MyViewSet(view.ViewSet):
# your code
def get_queryset(self):
queryset = super(MyViewSet, self).get_queryset()
ids = self.request.query_params.get('ids', None)
if ids:
ids_list = ids.split(',')
queryset = queryset.filter(id__in=ids_list)
return queryset