Я столкнулся с проблемой, что логический фильтр, созданный 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
Так что это, вероятно, следует упомянуть в документации DRF, потому что они предлагают импортировать из фильтров:
http://www.django-rest-framework.org/api-guide/filtering/#specifying -a-filterset
И это работает, конечно, во всех случаях, кроме BooleanFilter.
Самый полезный комментарий
Привет @инакрин. Вы должны импортировать
filters
из подпакетаrest_framework
.https://github.com/carltongibson/django-filter/blob/develop/django_filters/rest_framework/filters.py