Настройка фильтров в Django REST Framework

Настройка фильтров в Django REST Framework Изучение

Предварительное условие: добавление фильтрации в 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.

Читайте также:  Как создать экран подключения на Android?

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/

Вы можете ввести значения для фильтрации роботов. Отправка снимка экрана ниже.

Вы можете ввести значения для фильтрации роботов

Нажав кнопку отправки, вы получите отфильтрованные результаты. Отправка снимка экрана ниже.

Нажав кнопку отправки, вы получите отфильтрованные результаты

Оцените статью
bestprogrammer.ru
Добавить комментарий