Django-filter: django_filters.BooleanFilter с методом и логическим фильтром, унаследованным от модели, работают по-разному.

Созданный на 24 апр. 2017  ·  3Комментарии  ·  Источник: carltongibson/django-filter

Я столкнулся с проблемой, что логический фильтр, созданный django_filters.BooleanFilter, ожидает разные параметры запроса с логическим фильтром, унаследованным от модели.
Логический фильтр, унаследованный от модели, ожидает, что параметр будет истинным или ложным, фильтр, созданный BooleanFilter, ожидает, что параметры будут либо:
1 - переводится как "не установлено"
2 - переведено на "Правда"
3 - переведено на "Ложь"
Такое поведение делает неясным, как обрабатывать пользовательский фильтр rest API со стороны javascript.

Пример кода:

модели.ру:
class TestModel(models.Model): first = models.BooleanField() last = models.BooleanField()
API.py

`импортировать django_filters
из rest_framework импортировать наборы представлений, сериализаторы
из .models импортировать TestModel

класс TestFilter (django_filters.rest_framework.FilterSet):
first_and_last = django_filters.BooleanFilter (метод = 'first_and_last_filter')
def first_and_last_filter(я, набор запросов, имя, значение):
если значение==Истина:
вернуть queryset.filter (первый = Истина, последний = Истина);
вернуть набор запросов;
Мета класса:
модель = тестовая модель
fields = ['первый', 'последний', 'первый_и_последний']

класс TestSerializer (сериализаторы.ModelSerializer):
Мета класса:
модель = тестовая модель
поля = ['первый', 'последний']

класс TestViewSet(viewsets.ModelViewSet):
модель = тестовая модель
набор запросов = TestModel.objects.all()
serializer_class = тестовый сериализатор
filter_backends = (django_filters.rest_framework.DjangoFilterBackend,)
filter_fields = ('первый', 'последний', 'первый_и_последний', )
filter_class = ТестФильтр`

Фильтр тестового набора представлений здесь ожидает, что параметр запроса будет «истинным» или «ложным» для «первого» и «последнего» полей, но ожидает, что он будет равен 1,2 или 3 для поля фильтра «first_and_last».
Например, фильтрация холодного запроса будет выглядеть так:
/api/test/?first=true&first_and_last=2

Это упрощенный пример в реальном проекте, с которым я столкнулся, пользовательский фильтр содержит более сложную логику.
Я создал репозиторий со всем кодом, необходимым для воспроизведения проблемы.
https://github.com/inakrin/boolfilter

Самый полезный комментарий

Привет @инакрин. Вы должны импортировать filters из подпакета rest_framework .

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

Все 3 Комментарий

Привет @инакрин. Вы должны импортировать filters из подпакета rest_framework .

https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py

Так что это, вероятно, следует упомянуть в документации DRF, потому что они предлагают импортировать из фильтров:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
И это работает, конечно, во всех случаях, кроме BooleanFilter.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги