Использование поля из URL для фильтрации в ListAPIView в Django Rest Framework - PullRequest
1 голос
/ 01 апреля 2019

Я использую общий ListApiView Django Restframework, сериализатор, который используют, состоит из множества других сериализаторов (вложенных сериализаторов).Мне нужно знать, как я могу использовать ключевое слово из URL и передать его сериализатору, чтобы отфильтровать результат по ключевому слову в URL.

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

class GetList(Generics.ListApiView):
    serializer Class = ABCSerializer

Я хочу передать значение из URL-адреса, чтобы отфильтровать некоторые части результатов, генерируемых сериализатором.Этот ABCSerializer состоит из многих других вложенных сериализаторов.Я хочу отфильтровать результат, используя значение из URL, а не первичный ключ.

В приведенном ниже примере показан фильтр на основе имени пользователя в URL.

url('^purchases/(?P<username>.+)/$', PurchaseList.as_view()),

мы можем написатьпросмотр, который возвратил набор запросов на покупку, отфильтрованный по части имени пользователя в URL:

class PurchaseList(generics.ListAPIView):
    serializer_class = PurchaseSerializer

    def get_queryset(self):
        """
        This view should return a list of all the purchases for
        the user as determined by the username portion of the URL.
        """
        username = self.kwargs['username']
        return Purchase.objects.filter(purchaser__username=username)

, используя тот же подход, что и выше, я хочу использовать фильтр запроса, основанный на строке, отличной от имени пользователя,а также передать эту строку в сериализатор.и использовать его в качестве фильтра во вложенных сериализаторах.

Спасибо

1 Ответ

0 голосов
/ 01 апреля 2019

Вы можете использовать DjangoFilterBackend для фильтрации по полям вашей модели.

Вы можете сделать это, выполнив шаги

  1. Установите Django Filter в ваше приложение Django.

    pip install django-filter
    

    Добавить бэкэнд фильтра по умолчанию к вашему settings.py

    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
    }
    
  2. Введите filter_backends свойство вашего вида / набора просмотра, к которому вы хотите применить фильтр.

    from django_filters.rest_framework import DjangoFilterBackend
    
    class PurchaseList(generics.ListAPIView):
        ...
        filter_backends = (DjangoFilterBackend,)
    
  3. Добавить список полей модели в свойство filterset_fields в вашем представлении / наборе для применения фильтров к этим полям.

    class PurchaseList(generics.ListAPIView):
        queryset = Purchase.objects.all()
        serializer_class = PurchaseSerializer
        filter_backends = (DjangoFilterBackend,)
        filterset_fields = ('category', 'other_field')
    

    Я надеюсь, что этопоможет вам отфильтровать по ListAPIViews.

Для получения более подробной информации посетите API Guide по фильтру Django

Для расширенного использования фильтра / посетите пакет Джанго-отдых-рамочные фильтры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...