Как отфильтровать данные в DRF из базы данных по нескольким ключевым словам? - PullRequest
1 голос
/ 12 мая 2019

Я новичок и занимаюсь разработкой небольшого REST API-проекта с Django rest framework. В базе данных PostgreSQL есть куча записей с текстовым полем, и у меня есть несколько списков ключевых слов. Я пытаюсь отфильтровать данные, которые содержат слова из одного или нескольких моих списков ключевых слов в этом текстовом поле.

Можете ли вы посоветовать мне другой способ организации фильтрации в DRF, используя целый список ключевых слов сразу, не вводя их в форму?

Я пытаюсь сделать это с django_filters

Вот если класс фильтра:

# filter

class DataFilter(django_filters.rest_framework.FilterSet):
    keyword = CharFilter(field_name='description', lookup_expr='icontains')

    class Meta:
        model = Data
        fields = ('keyword', )

Вот если посмотреть класс:

# view

class DataList(generics.ListAPIView): 

    def get_queryset(self):
        return Data.objects.filter(deadline__gte=date.today())

    serializer_class = DataSerializer   
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = DataFilter

Но в этом случае он фильтрует только по одному слову, которое я ввожу в форму.

1 Ответ

0 голосов
/ 12 мая 2019

Я думаю, вы можете сделать это следующим образом:

Сначала создайте новый подклассы набора фильтров из BaseInFilter и CharFilter:

class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
    pass

Затем,обновите свой класс FilterSet следующим образом:

class DataFilter(django_filters.FilterSet):
    keyword__in = CharInFilter(field_name='keyword', lookup_expr='in')

    class Meta:
        model = Data
        fields = []

Затем вы можете использовать этот FilterSet (так же, как ваша текущая реализация) следующим образом:

class DataList(generics.ListAPIView): 

    def get_queryset(self):
        return Data.objects.filter(deadline__gte=date.today())

    serializer_class = DataSerializer   
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = DataFilter

При использовании этого набора фильтров в шаблоне DRF вынеобходимо ввести значения в формате через запятую, например: enter image description here

...