Освоение Django-Filter: раскрытие возможностей фильтрации полей

  1. Базовая фильтрация полей

Самый простой способ фильтровать поля в Django-Filter — использовать класс FilterSet. Вы можете определить класс, который наследует от FilterSet, и указать поля, которые вы хотите фильтровать. Например, предположим, что у нас есть модель под названием Bookс полем под названием price. Чтобы отфильтровать книги, цена которых превышает определенное значение, вы можете определить FilterSetследующим образом:

import django_filters
class BookFilter(django_filters.FilterSet):
    price__gt = django_filters.NumberFilter(field_name='price', lookup_expr='gt')
    class Meta:
        model = Book
        fields = ['price']

В этом фрагменте кода мы определяем параметр фильтра price__gt, который представляет условие фильтрации книг с ценой, превышающей указанное значение. Аргумент field_nameуказывает имя поля в модели, а lookup_expr='gt'устанавливает для оператора сравнения значение «больше».

  1. Пользовательские выражения поиска

Django-Filter предоставляет широкий спектр выражений поиска, которые можно использовать для выполнения сложной фильтрации полей. Например, если вы хотите отфильтровать книги, цена которых больше или равна определенному значению, вы можете изменить класс BookFilterследующим образом:

class BookFilter(django_filters.FilterSet):
    price__gte = django_filters.NumberFilter(field_name='price', lookup_expr='gte')
    class Meta:
        model = Book
        fields = ['price']

Теперь вы можете использовать параметр фильтра price__gteдля фильтрации книг, цена которых больше или равна указанному значению.

  1. Фильтрация по нескольким полям

Иногда вам может потребоваться фильтровать записи по нескольким полям одновременно. Django-Filter позволяет легко добиться этого. Допустим, мы хотим отфильтровать книги, цена которых превышает определенное значение, а год публикации меньше определенного года. Вот как это можно сделать:

class BookFilter(django_filters.FilterSet):
    price__gt = django_filters.NumberFilter(field_name='price', lookup_expr='gt')
    year__lt = django_filters.NumberFilter(field_name='year', lookup_expr='lt')
    class Meta:
        model = Book
        fields = ['price', 'year']

В этом примере мы определяем два параметра фильтра: price__gtи year__lt, чтобы фильтровать книги по цене и году публикации соответственно. Вы можете комбинировать несколько параметров фильтра для достижения сложных требований к фильтрации.

  1. Фильтрация связанных полей

Django-Filter также поддерживает фильтрацию связанных полей. Допустим, у нас есть модель под названием Author, которая имеет связь внешнего ключа с моделью Book, и мы хотим фильтровать книги по имени автора. Вот как этого можно добиться:

class BookFilter(django_filters.FilterSet):
    author__name = django_filters.CharFilter(field_name='author__name', lookup_expr='icontains')
    class Meta:
        model = Book
        fields = ['author__name']

В этом случае мы определяем параметр фильтра author__name, который фильтрует книги по имени автора с использованием совпадения без учета регистра (icontains).

<ол старт="5">

  • Объединение фильтров
  • Django-Filter позволяет комбинировать несколько фильтров с помощью логических операторов, таких как И и ИЛИ. Например, если вы хотите отфильтровать книги, цена которых превышает определенное значение ИЛИ опубликованы в определенном году, вы можете сделать это следующим образом:

    class BookFilter(django_filters.FilterSet):
        price__gt = django_filters.NumberFilter(field_name='price', lookup_expr='gt')
        year__exact = django_filters.NumberFilter(field_name='year', lookup_expr='exact')
        class Meta:
            model = Book
            fields = ['price', 'year']
        @property
        def qs(self):
            parent = super().qs
            return parent.filter(django_filters.Q(price__gt=self.request.GET.get('price')) | 
                                 django_filters.Q(year__exact=self.request.GET.get('year')))

    В этом примере мы переопределяем свойство qs, чтобы объединить фильтры с помощью объекта Qи логического оператора ИЛИ (|).

    Итак, вот оно! Мы рассмотрели несколько методов фильтрации полей с помощью Django-Filter. С помощью этих методов вы можете эффективно сузить результаты запроса и получить именно те данные, которые вам нужны. Django-Filter предлагает мощный набор инструментов для обработки различных сценариев фильтрации: от базовой фильтрации полей до пользовательских выражений поиска, фильтрации нескольких полей, фильтрации связанных полей и комбинирования фильтров.

    Не забудьте настроить примеры кода в соответствии с вашими конкретными моделями и полями. Удачной фильтрации!