2016-04-25 24 views
1

在使用DRF时,是否可以通过ID数组进行过滤? 例如,如果我想用下面的ID返回的所有图像,我会做到这一点:通过DRF 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 

然而,在这种case ProjectImageFilter需要指定一个模型(ProjectImage)。有没有一种方法可以简单地定义此过滤器,以便我可以在多个ViewSets上使用不同的模型?

+0

不是一个解决方案,但是出于同样的原因,我已经添加了额外的字段到我的模型来存储文件名甚至文件关键字。这样我就可以通过名称和关键字轻松搜索我的文件。 – WayBehind

回答

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