Использование поля из URL для фильтрации в ListAPIView в Django Rest Framework

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Я использую общий 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. Вы можете попробовать filter_backends и filterset_fields здесь django-rest-framework.org/api-guide/filtering . Но, возможно, потребуется более подробная информация по вашему вопросу, например.

Ответ №1:

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

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

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

     pip install django-filter
      

    Добавьте серверную часть фильтра по умолчанию в свой settings.py

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

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

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

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

Для получения более подробной информации посетите Руководство по API по Django filter

Для использования расширенного фильтра посетите пакет django-rest-framework-filters

Комментарии:

1. filterset_fields для меня было важно до того, как в представлении html api появилась кнопка «фильтр». Отсутствует в документах! Кроме того, кажется, что вы не можете дать "__all__" здесь.