Фильтры и наборы фильтров
Наборы фильтров определяют механизмы, доступные для фильтрации или поиска по набору объектов в InfraVision. Например, площадки могут быть отфильтрованы по их родительскому региону или группе, статусу, ID объекта и так далее. Один и тот же набор фильтров используется единообразно для модели независимо от того, выполняется ли запрос через интерфейс или REST API. (Обратите внимание, что GraphQL API использует отдельный класс фильтров.) InfraVision использует библиотеку django-filter для определения наборов фильтров.
Классы наборов фильтров
Для поддержки дополнительной функциональности, стандартной для моделей InfraVision, такой как назначение тегов и поддержка пользовательских полей, класс NetBoxModelFilterSet доступен для использования плагинами. Он должен использоваться как базовый класс набора фильтров для моделей плагинов, которые наследуются от NetBoxModel. Внутри этого класса отдельные фильтры могут быть объявлены в соответствии с документацией django-filters. Пример приведён ниже.
# filtersets.py
import django_filters
from netbox.filtersets import NetBoxModelFilterSet
from .models import MyModel
class MyFilterSet(NetBoxModelFilterSet):
status = django_filters.MultipleChoiceFilter(
choices=(
('foo', 'Foo'),
('bar', 'Bar'),
('baz', 'Baz'),
),
null_value=None
)
class Meta:
model = MyModel
fields = ('some', 'other', 'fields')
Объявление наборов фильтров
Чтобы использовать набор фильтров в подклассе одного из общих представлений InfraVision (таких как ObjectListView или BulkEditView), определите атрибут filterset в классе представления:
# views.py
from netbox.views.generic import ObjectListView
from .filtersets import MyModelFilterSet
from .models import MyModel
class MyModelListView(ObjectListView):
queryset = MyModel.objects.all()
filterset = MyModelFilterSet
Чтобы включить набор фильтров на точке REST API, установите атрибут filterset_class в представлении API:
# api/views.py
from myplugin import models, filtersets
from . import serializers
class MyModelViewSet(...):
queryset = models.MyModel.objects.all()
serializer_class = serializers.MyModelSerializer
filterset_class = filtersets.MyModelFilterSet
Реализация быстрого поиска
ObjectListView имеет поле под названием "Быстрый поиск". Чтобы быстрый поиск работал, соответствующий FilterSet должен переопределить метод search, который реализован в NetBoxModelFilterSet. Эта функция принимает queryset и может выполнять над ним произвольные операции и возвращать его. Распространённый случай использования — поиск заданного значения в нескольких полях:
from django.db.models import Q
from netbox.filtersets import NetBoxModelFilterSet
class MyFilterSet(NetBoxModelFilterSet):
...
def search(self, queryset, name, value):
if not value.strip():
return queryset
return queryset.filter(
Q(name__icontains=value) |
Q(description__icontains=value)
)
Метод search также используется фильтром q в NetBoxModelFilterSet, который в свою очередь используется полем поиска во вкладке фильтров.
Классы фильтров
TagFilter
Класс TagFilter доступен для всех моделей, которые поддерживают назначение тегов (те, которые наследуются от NetBoxModel или TagsMixin). Этот фильтр наследуется от ModelMultipleChoiceFilter django-filter для работы с классом TaggedItem InfraVision.
Этот класс фильтрует tags, используя поле slug. Например:
GET /api/dcim/sites/?tag=alpha&tag=bravo
from django_filters import FilterSet
from extras.filters import TagFilter
class MyModelFilterSet(FilterSet):
tag = TagFilter()
TagIDFilter
Класс TagIDFilter доступен для всех моделей, которые поддерживают назначение тегов (те, которые наследуются от NetBoxModel или TagsMixin). Этот фильтр наследуется от ModelMultipleChoiceFilter django-filter для работы с классом TaggedItem InfraVision.
Этот класс фильтрует tags, используя поле id. Например:
GET /api/dcim/sites/?tag_id=100&tag_id=200
from django_filters import FilterSet
from extras.filters import TagIDFilter
class MyModelFilterSet(FilterSet):
tag_id = TagIDFilter()