#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
для фильтрации по полям вашей модели.
Вы можете сделать это, выполнив следующие шаги
-
Установите Django Filter в свое приложение Django.
pip install django-filter
Добавьте серверную часть фильтра по умолчанию в свой
settings.py
REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',) }
-
Введите
filter_backends
свойство вашего представления / viewset, к которому вы хотите применить фильтр.from django_filters.rest_framework import DjangoFilterBackend class PurchaseList(generics.ListAPIView): ... filter_backends = (DjangoFilterBackend,)
-
Добавьте список полей модели в
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__"
здесь.