nautobot.apps.filters
¶
Filterset base classes and mixins for app implementation.
nautobot.apps.filters.AutoDistinctFilterMixin
¶
Mixin for MultipleChoiceFilter subclasses that derives the distinct flag from the filter's field path.
django_filters.MultipleChoiceFilter defaults to distinct=True, but a .distinct() call is only needed
when a filter traverses a to-many relation, and it imposes a significant performance cost at scale otherwise.
The model isn't known when a filter is instantiated as a class attribute, so resolution is deferred until
self.model has been set (see django_filters.filterset.BaseFilterSet.__init__).
An explicitly provided distinct= argument always takes precedence, as does the class default in cases where
the field path can't be resolved (a filter with a method, for example).
nautobot.apps.filters.BaseFilterSet
¶
Bases: FilterSet
A base filterset which provides common functionality to all Nautobot filtersets.
errors
property
¶
Extend FilterSet.errors to potentially include additional errors from settings.STRICT_FILTERING.
add_filter(new_filter_name, new_filter_field)
classmethod
¶
Allow filters to be added post-generation on import.
Will provide <field_name>__<lookup_expr> generation automagically.
filter_for_lookup(field, lookup_type)
classmethod
¶
Override filter_for_lookup method to set ChoiceField Filter to MultipleChoiceFilter.
Note: Any CharField or IntegerField with choices set is a ChoiceField.
get_filters()
classmethod
¶
Override filter generation to support dynamic lookup expressions for certain filter types.
is_valid()
¶
Extend FilterSet.is_valid() to potentially enforce settings.STRICT_FILTERING.
nautobot.apps.filters.BooleanFilter
¶
Bases: AutoDistinctFilterMixin, BooleanFilter
Subclass of the django-filters class by the same name, which auto-derives its distinct flag.
Note that an isnull=True lookup can never return duplicates, even across a to-many relation: it matches
only objects that have no related rows, of which the outer join produces exactly one per object. The
.distinct() is therefore skipped for that case regardless of the derived value.
nautobot.apps.filters.ConfigContextRoleFilter
¶
Bases: NaturalKeyOrPKMultipleChoiceFilter
Limit role choices to the available role choices for Device and VM
nautobot.apps.filters.ContentTypeChoiceFilter
¶
Bases: ContentTypeFilterMixin, ChoiceFilter
Allows character-based ContentType filtering by
Example use on a FilterSet:
content_type = ContentTypeChoiceFilter(
choices=FeatureQuery("dynamic_groups").get_choices,
)
In most cases you should use ContentTypeMultipleChoiceFilter instead.
nautobot.apps.filters.ContentTypeFilter
¶
Bases: ContentTypeFilterMixin, CharFilter
Allows character-based ContentType filtering by
Does not support limiting of choices. Can be used without arguments on a FilterSet:
content_type = ContentTypeFilter()
nautobot.apps.filters.ContentTypeFilterMixin
¶
Mixin to allow specifying a ContentType by
nautobot.apps.filters.ContentTypeMultipleChoiceFilter
¶
Bases: AutoDistinctFilterMixin, MultipleChoiceFilter
Allows multiple-choice ContentType filtering by
Does NOT allow filtering by PK at this time; it would need to be reimplemented similar to NaturalKeyOrPKMultipleChoiceFilter as a breaking change.
Defaults to joining multiple options with "AND". Pass conjoined=False to
override this behavior to join with "OR" instead.
Example use on a FilterSet:
content_types = ContentTypeMultipleChoiceFilter(
choices=FeatureQuery("statuses").get_choices,
)
nautobot.apps.filters.CustomFieldModelFilterSetMixin
¶
Bases: FilterSet
Dynamically add a Filter for each CustomField applicable to the parent model. Add filters for extra lookup expressions on supported CustomField types.
nautobot.apps.filters.FilterExtension
¶
Class that may be returned by a registered Filter Extension function.
nautobot.apps.filters.MappedPredicatesFilterMixin
¶
A filter mixin to provide the ability to specify fields and lookup expressions to use for filtering.
A mapping of filter predicates (field_name: lookup_expr) must be provided to the filter when
declared on a filterset. This mapping is used to construct a Q query to filter based on the
provided predicates.
By default a predicate for {"id": "iexact"} (id__exact) will always be included.
Example:
q = SearchFilter(
filter_predicates={
"comments": "icontains",
"name": "icontains",
},
)
Optionally you may also provide a callable to use as a preprocessor for the filter predicate by providing the value as a nested dict with "lookup_expr" and "preprocessor" keys. For example:
q = SearchFilter(
filter_predicates={
"asn": {
"lookup_expr": "exact",
"preprocessor": int,
},
},
)
This tells the filter to try to cast asn to an int. If it fails, this predicate will be
skipped.
distinct
property
writable
¶
Derive distinct from the filter predicates, as this filter has no single field_name of its own.
Every predicate is OR'd into a single .filter() call, so a .distinct() is required if any one of
them traverses a to-many relation. See AutoDistinctFilterMixin, of which this is a variation.
generate_query(value, **kwargs)
¶
Given a value, return a Q object for 2-tuple of predicate=value. Filter predicates are
read from the instance filter. Any kwargs are ignored.
nautobot.apps.filters.ModelMultipleChoiceFilter
¶
Bases: AutoDistinctFilterMixin, ModelMultipleChoiceFilter
Subclass of the django-filters class by the same name with an improved default label formulation.
Also auto-derives its distinct flag from the field path; see AutoDistinctFilterMixin.
label
property
writable
¶
Override django_filters.Filter.label property to generate a more useful default label.
Examples:
>>> import django_filters
>>> from nautobot.core.filters import BaseFilterSet, ModelMultipleChoiceFilter
>>> class DemoFilterSet(BaseFilterSet):
... class Meta:
... model = Interface
... fields = []
... old_device = django_filters.ModelMultipleChoiceFilter(queryset=Device.objects.all(), field_name="device")
... new_device = ModelMultipleChoiceFilter(queryset=Device.objects.all(), field_name="device")
... device_name = ModelMultipleChoiceFilter(queryset=Device.objects.all(), field_name="device", to_field_name="name")
...
>>> DemoFilterSet().filters["old_device"].label
'Device'
>>> DemoFilterSet().filters["new_device"].label
'Device (ID)'
>>> DemoFilterSet().filters["device_name"].label
'Device (Name)'
nautobot.apps.filters.MultiValueBigNumberFilter
¶
Bases: MultiValueNumberFilter
Subclass of MultiValueNumberFilter used for BigInteger model fields.
nautobot.apps.filters.MultipleChoiceFilter
¶
Bases: AutoDistinctFilterMixin, MultipleChoiceFilter
Subclass of the django-filters class by the same name, which auto-derives its distinct flag.
nautobot.apps.filters.NameSearchFilterSet
¶
Bases: FilterSet
A base class for adding the search method to models which only expose the name field in searches.
nautobot.apps.filters.NaturalKeyOrPKMultipleChoiceFilter
¶
Bases: ModelMultipleChoiceFilter
Filter that supports filtering on values matching the pk field and another
field of a foreign-key related object. The desired field is set using the to_field_name
keyword argument on filter initialization (defaults to name).
NOTE that the to_field_name field does not have to be a "true" natural key (ie. unique), it
was just the best name we could come up with for this filter
to_field_name_label
property
¶
__init__(*args, prefers_id=False, **kwargs)
¶
Initialize the NaturalKeyOrPKMultipleChoiceFilter.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
prefers_id
|
bool
|
Prefer PK (ID) over the 'to_field_name'. Defaults to False. |
False
|
get_filter_predicate(v)
¶
Override base filter behavior to force the filter to use the pk field instead of
the natural key in the generated filter.
nautobot.apps.filters.NautobotFilterSet
¶
Bases: BaseFilterSet, CreatedUpdatedModelFilterSetMixin, RelationshipModelFilterSetMixin, CustomFieldModelFilterSetMixin
This class exists to combine common functionality and is used as a base class throughout the codebase where all of BaseFilterSet, CreatedUpdatedModelFilterSetMixin, RelationshipModelFilterSetMixin and CustomFieldModelFilterSetMixin are needed.
nautobot.apps.filters.NumericArrayFilter
¶
Bases: NumberFilter
Filter based on the presence of an integer within an ArrayField.
nautobot.apps.filters.PrefixFilter
¶
Bases: NaturalKeyOrPKMultipleChoiceFilter
Filter that supports filtering a foreign key to Prefix by either its PK or by a literal prefix string.
nautobot.apps.filters.RelatedMembershipBooleanFilter
¶
Bases: BooleanFilter
BooleanFilter for related objects that will explicitly perform isnull lookups.
The field_name argument is required and must be set to the related field on the
model.
This should be used instead of a default BooleanFilter paired method=
argument to test for the existence of related objects.
Example:
has_modules = RelatedMembershipBooleanFilter(
field_name="module_bays__installed_module",
label="Has modules",
)
This would generate a filter that returns instances that have at least one module
bay with an installed module. The `has_modules=False` filter would exclude instances
with at least one module bay with an installed module.
Set `exclude=True` to reverse the behavior of the filter. This __may__ be useful
for filtering on null directly related fields but this filter is not smart enough
to differentiate between `fieldA__fieldB__isnull` and `fieldA__isnull` so it's not
suitable for cases like the `has_empty_module_bays` filter where an instance may
not have any module bays.
See the below table for more information:
| value | exclude | Result
|-------------|------------------|-------
| True | False (default) | Return instances with at least one non-null match -- qs.filter(field_name__isnull=False)
| False | False (default) | Exclude instances with at least one non-null match -- qs.exclude(field_name__isnull=False)
| True | True | Return instances with at least one null match -- qs.filter(field_name__isnull=True)
| False | True | Exclude instances with at least one null match -- qs.exclude(field_name__isnull=True)
nautobot.apps.filters.RelationshipFilter
¶
Bases: ModelMultipleChoiceFilter
Filter objects by the presence of associations on a given Relationship.
nautobot.apps.filters.RelationshipModelFilterSetMixin
¶
Bases: FilterSet
Filterset for relationships applicable to the parent model.
nautobot.apps.filters.RoleFilter
¶
nautobot.apps.filters.RoleModelFilterSetMixin
¶
Bases: FilterSet
Mixin to add a role filter field to a FilterSet.
nautobot.apps.filters.SearchFilter
¶
Bases: MappedPredicatesFilterMixin, CharFilter
Provide a search filter for use on filtersets as the q= parameter.
See the docstring for nautobot.core.filters.MappedPredicatesFilterMixin for usage.
nautobot.apps.filters.StatusFilter
¶
nautobot.apps.filters.StatusModelFilterSetMixin
¶
Bases: FilterSet
Mixin to add a status filter field to a FilterSet.
nautobot.apps.filters.TagFilter
¶
Bases: NaturalKeyOrPKMultipleChoiceFilter
Match on one or more assigned tags. If multiple tags are specified (e.g. ?tag=foo&tag=bar), the queryset is filtered to objects matching all tags.
nautobot.apps.filters.TenancyModelFilterSetMixin
¶
Bases: FilterSet
An inheritable FilterSet for models which support Tenant assignment.
nautobot.apps.filters.TreeNodeMultipleChoiceFilter
¶
Bases: NaturalKeyOrPKMultipleChoiceFilter
Filter that matches on the given model(s) (identified by name and/or pk) as well as their tree descendants.
For example, if we have:
Location "Earth"
Location "USA"
Location "GA" <- Location "Athens"
Location "NC" <- Location "Durham"
a NaturalKeyOrPKMultipleChoiceFilter on Location for {"parent": "USA"} would only return "GA" and "NC" since that is the only two locations that have an immediate parent "USA" but a TreeNodeMultipleChoiceFilter on Location for {"parent": "USA"} would match both "Athens" and "Durham" in addition to "GA" and "NC".
generate_query(value, qs=None, **kwargs)
¶
Given a filter value, return a Q object that accounts for nested tree node descendants.
nautobot.apps.filters.multivalue_field_factory(field_class, widget=django_forms.SelectMultiple)
¶
Given a form field class, return a subclass capable of accepting multiple values. This allows us to OR on multiple filter values while maintaining the field's built-in validation. Example: GET /api/dcim/devices/?name=foo&name=bar