Django-Filter возвращает объект запроса - PullRequest
0 голосов
/ 28 ноября 2018

Я пытался динамически фильтровать набор запросов в Django, используя библиотеку Django-filters в DRF, но фильтры отправляют ответ точно так же, как и запрос, то есть, если я выбираю режим = передача, ответ равен

{
  "data": {
    "mode": "transfer"
  }
}

filterset_class определяется в представлениях, и ему передается набор запросов вместе с типом запроса.

views.py

from .filters import DataFilter
def get(self, request):

    query_set = ModelName.objects.all()
    queryset_filter = DataFilter(
        request.GET, queryset=query_set)
    return Response({"data": queryset_filter.data}, status=status.HTTP_200_OK)

фильтры.py

from django_filters import rest_framework as filters
from .models import ModelName
from common.models import MODE_CHOICES


class DataFilter(filters.FilterSet):

    currency = filters.ModelMultipleChoiceFilter(lookup_expr='iexact')
    coin_type = filters.ModelMultipleChoiceFilter(lookup_expr='iexact')
    mode = filters.ModelChoiceFilter(
        lookup_expr='iexact', choices=MODE_CHOICES)
    max_amount = filters.NumberFilter(
        field_name='price', lookup_expr='gt')
    min_amount = filters.NumberFilter(
        field_name='amount', lookup_expr='lt')

    class Meta:
        model = ModelName
        fields = ('currency', 'coin_type', 'mode',
                  'max_amount', 'min_amount')

Документация по django-фильтрам предполагает, что бэкэнд-фильтр django можно использовать по умолчанию, добавив его в DEFAULT_FILTER_BACKENDS.Есть какая-то конфигурация, которую мне не хватает или что-то

1 Ответ

0 голосов
/ 11 декабря 2018

Атрибут filterset.data - это буквально параметры данных / запроса, которые вы предоставляете DataFilter при инициализации.В этом случае вы предоставляете request.GET в качестве данных.

Вы хотите получить доступ к свойству .qs набора фильтров, которое представляет собой отфильтрованные результаты.например,

def get(self, request):
    queryset_filter = DataFilter(request.GET, queryset=ModelName.objects.all())
    return Response({"data": queryset_filter.qs}, status=status.HTTP_200_OK)

Обратите внимание, что вам, вероятно, потребуется сериализовать отфильтрованный набор запросов.

...