Предварительное условие: добавление фильтрации в API — Django REST Framework [lin необходимая статья уже опубликована]
Фильтры Django упрощают фильтрацию набора запросов для получения релевантных результатов на основе значений, присвоенных полям фильтра. Но что, если пользователь хочет получить детали в пределах заданного диапазона. Скажем, например, пользователю нужно получить подробную информацию о роботах в зависимости от ценового диапазона. Здесь возникает необходимость настройки фильтров. Давайте создадим и применим настраиваемый фильтр к модели робота, чтобы пользователь мог получить сведения о роботе, указав название категории робота, название производителя, валюту, диапазон дат производства и / или ценовой диапазон.
Мы создадим новый класс с именем RobotFilter class, который является подклассом класса django_filters.FilterSet. Объявим импорт
from
django_filters
import
FilterSet, AllValuesFilter
from
django_filters
import
DateTimeFilter, NumberFilter
Теперь вы можете добавить приведенный ниже код перед классом RobotList.
class
RobotFilter(FilterSet):
from_manufacturing_date
=
DateTimeFilter(field_name
=
'manufacturing_date'
,
lookup_expr
=
'gte'
)
to_manufacturing_date
=
DateTimeFilter(field_name
=
'manufacturing_date'
,
lookup_expr
=
'lte'
)
min_price
=
NumberFilter(field_name
=
'price'
, lookup_expr
=
'gte'
)
max_price
=
NumberFilter(field_name
=
'price'
, lookup_expr
=
'lte'
)
robotcategory_name
=
AllValuesFilter(field_name
=
'robot_category__name'
)
manufacturer_name
=
AllValuesFilter(field_name
=
'manufacturer__name'
)
class
Meta:
model
=
Robot
fields
=
(
'name'
,
'currency'
,
'from_manufacturing_date'
,
'to_manufacturing_date'
,
'min_price'
,
'max_price'
,
'robotcategory_name'
,
'manufacturer_name'
,
)
Посмотрим на атрибуты, объявленные в классе RobotFilter.
- from_manufacturing_date
- to_manufacturing_date
- min_price
- max_price
- robotcategory_name
- manufacturer_name
from_manufacturing_date: это атрибут экземпляра django_filters.DateTimeFilter, который фильтрует роботов, чье значение production_date больше или равно заданному значению DateTime. Здесь, в DateTimeFilter, есть два параметра, названные field_name и lookup_expr. Поле field_name имеет дату изготовления (для фильтрации), а «gte» (больше или равно) применяется к lookup_expr.
to_manufacturing_date: это атрибут экземпляра django_filters.DateTimeFilter, который фильтрует роботов, значение production_date которых меньше или равно заданному значению DateTime. Здесь, в DateTimeFilter, есть два параметра, названные field_name и lookup_expr. В field_name мы указали дату изготовления, а lte (меньше или равно) применяется к lookup_expr.
min_price: это атрибут экземпляра django_filters.NumberFilter, который фильтрует роботов, значение цены которых больше или равно указанному значению цены.
max_price: это атрибут экземпляра django_filters.NumberFilter, который фильтрует роботов, значение цены которых меньше или равно указанному значению цены.
robotcategory_name: это атрибут экземпляра django_filters.AllValuesFilter, который фильтрует роботов, чье имя категории роботов совпадает с указанным строковым значением. Вы можете заметить, что есть двойное подчеркивание (__) стоимость, предоставленной field_name, между robot_category и именем. Поле field_name использует двойное подчеркивание Django, чтобы читать его как поле имени для модели RobotCategory. Это помогает получить подробную информацию о роботе на основе имени категории робота, а не его идентификатора pk.
Manufacturer_name: это атрибут экземпляра django_filters.AllValuesFilter, который фильтрует роботов, название производителя которых совпадает с указанным строковым значением. Поле field_name использует двойное подчеркивание Django для чтения значения «Manufacturer__name» как поля имени для модели производителя. Это помогает получить подробную информацию о роботе на основе имени производителя, а не его идентификатора ПК.
Класс RobotFilter также определяет внутренний класс Meta. Этот класс имеет две модели атрибутов и поля. Атрибут model указывает модель (робота) для фильтрации. А атрибут fields содержит имена полей и имена фильтров (в виде кортежа строк) для включения в фильтры для упомянутой модели (Robot).
Давайте использовать класс RobotFilter в нашем классе RobotList. Код следующим образом
class
RobotList(generics.ListCreateAPIView):
queryset
=
Robot.objects.
all
()
serializer_class
=
RobotSerializer
name
=
'robot-list'
# customized filter class
filter_class
=
RobotFilter
search_fields
=
(
'^name'
,
)
ordering_fields
=
(
'price'
,
)
Давайте отфильтруем роботов по дате изготовления. Команда HTTPie
http “:8000/robot/?from_manufacturing_date=2019-10-01&to_manufacturing_date=2020-03-01”
Выход:
Давайте отфильтруем роботов по названию категории роботов и названию производителя. Команда HTTPie, как показано ниже
http “:8000/robot/?robotcategory_name=Articulated Robots&manufacturer_name=Fanuc”
Выход:
Давайте отфильтруем роботов по ценовому диапазону. Команда HTTPie
http “:8000/robot/?min_price=10000&max_price=20000¤cy=USD”
Выход:
Давайте отфильтруем роботов с помощью просматриваемой функции API. Вы можете просмотреть приведенный ниже URL-адрес и нажать кнопку фильтра.
http://127.0.0.1:8000/robot/
Вы можете ввести значения для фильтрации роботов. Отправка снимка экрана ниже.
Нажав кнопку отправки, вы получите отфильтрованные результаты. Отправка снимка экрана ниже.