2016-04-25 2 views
1

Существует ли общий способ фильтрации по массиву идентификаторов при использовании DRF? Например, если бы я хотел, чтобы вернуть все изображения со следующими идентификаторами, я хотел бы сделать это:Общий способ фильтрации по идентификаторам с DRF

/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

Не решение, однако по тем же причинам я добавил дополнительные поля в свою модель для хранения имени файла и даже ключевых слов файла. Таким образом, я могу легко искать файлы по имени и ключевому слову. – 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 
Смежные вопросы