Django-filter получить набор запросов

Я использую django-filter v1.1.0, django 1.11. Мне нужен динамический фильтр для модели. Я создал файл filters.py, который содержит соответствующую конфигурацию для фильтров модели. Этот сайт сообщает, что:

Он сгенерирует форму Django с полями поиска, а также вернет отфильтрованный QuerySet.

Здесь это относится к SomeModelFilter функции. Я пробовал применить к нему функции len и objects, но он возвращает

AttributeError: 'SomeModelFilter' object has no attribute 'len'
AttributeError: 'SomeModelFilter' object has no attribute 'objects'

Я хочу получить отфильтрованный контент. Мне это не кажется QuerySet.

Filters.py

from project_app.models import *
import django_filters


class SomeModelFilter(django_filters.FilterSet):
    class Meta:
        model = SomeModel
        fields = ['field_a', 'field_b', 'field_c', 'field_d']

views.py

    somemodel_list = SomeModel.objects.all()
    somemodel_filter = SomeModelFilter(request.GET, queryset=somemodel_list)

    print(len(somemodel_filter)) # This gives the first error
    print(somemodel_filter.objects.all()) # This gives the second error

Я хочу получить отфильтрованный контент, который, надеюсь, содержится в объекте somemodel_filter.


person Rakmo    schedule 28.05.2018    source источник
comment
Можете ли вы опубликовать код полного просмотра?   -  person neverwalkaloner    schedule 28.05.2018
comment
@ Neverwalkaloner, другая часть кода не имеет отношения к вопросу.   -  person Rakmo    schedule 28.05.2018
comment
Похоже, ошибка возникла где-то после инициализации somemodel_filter. Было бы здорово, если бы вы также могли добавить просмотр и полную трассировку.   -  person neverwalkaloner    schedule 28.05.2018
comment
@ Neverwalkaloner добавил операторы печати, которые дают ошибку. Думаю, этого должно хватить. Мне просто нужно содержимое somemodel_filter   -  person Rakmo    schedule 28.05.2018


Ответы (2)


Проблема в этой строке print(somemodel_filter.objects.all()). somemodel_filter не является моделью, это экземпляр набора фильтров, и поскольку он не имеет атрибута objects. Чтобы получить отфильтрованный набор запросов, используйте атрибут qs, например:

print(somemodel_filter.qs)

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

person neverwalkaloner    schedule 28.05.2018
comment
Как обрабатывать фильтр на основе поля внешнего ключа? - person Rakmo; 29.05.2018
comment
@OmkarDeshpande, как и любое другое поле, по умолчанию вы должны передать идентификатор для фильтрации по внешнему ключу. - person neverwalkaloner; 29.05.2018

filtered_data = ExampleFilter(requet.Get, queryset=Example.objects.all())

чтобы получить отфильтрованный запрос

filtered_queryset_data = filtered_data.qs

Используйте сериализатор для сериализации данных. Используйте many = true, так как это список

serialized_data = ExampleSerializer(filtered_queryset_data, many=true).data
person Suthanth DK    schedule 12.03.2020