Filters

Support for django-filter.

class django_enum.filters.EnumFilter(*, enum: Type[Enum], strict: bool = True, **kwargs)[source]

Bases: TypedChoiceFilter

Use this filter class instead of ChoiceFilter to get filters to accept Enum labels and symmetric properties.

For example if we have an enumeration field defined with the following Enum:

class Color(TextChoices):

    rgb: Annotated[Tuple[int, int, int], Symmetric()]
    hex: Annotated[str, Symmetric(case_fold=True)]

    RED   = 'R', 'Red',   (1, 0, 0), 'ff0000'
    GREEN = 'G', 'Green', (0, 1, 0), '00ff00'
    BLUE  = 'B', 'Blue',  (0, 0, 1), '0000ff'

color = EnumField(Color)

The default ChoiceFilter will only work with the enumeration values: ?color=R, ?color=G, ?color=B. EnumFilter will accept query parameter values from any of the symmetric properties: ?color=Red, ?color=ff0000, etc…

Parameters:
  • enum – The class of the enumeration containing the values to filter on

  • strict – If False (default), values not in the enumeration will be searchable.

  • kwargs – Any additional arguments from the base classes (TypedChoiceFilter)

__init__(*, enum: Type[Enum], strict: bool = True, **kwargs)[source]
enum: Type[Enum]
field_class

alias of EnumChoiceField

strict: bool
class django_enum.filters.EnumFlagFilter(*, enum: Type[Flag], strict: bool = True, conjoined: bool = False, **kwargs)[source]

Bases: TypedMultipleChoiceFilter

Use this filter class with FlagField fields. It will allow the field to be listed multiple times in URL query strings (e.g. field=value&field=value). By default the filter will query on these values with has_any these values together. Use conjoined to use has_all instead.

This filter also respects the TypedMultipleChoiceFilter base class parameters such as exclude.

Parameters:
  • enum – The class of the enumeration containing the values to filter on

  • strict – If False (default), values not in the enumeration will be searchable.

  • conjoined – If True use has_all lookup, otherwise use has_any (default)

  • kwargs – Any additional arguments from base classes, (TypedMultipleChoiceFilter)

__init__(*, enum: Type[Flag], strict: bool = True, conjoined: bool = False, **kwargs)[source]
enum: Type[Flag]
field_class

alias of EnumFlagField

filter(qs, value)[source]
is_noop(qs, value)[source]

Return True to short-circuit unnecessary and potentially slow filtering.

class django_enum.filters.FilterSet(data=None, queryset=None, *, request=None, prefix=None)[source]

Bases: FilterSet

This filterset behaves the same way as the django-filter FilterSet except the following fields will be set to the following filter types:

If you have a custom FilterSet implementation, this class can also be used as a mixin.

FILTER_DEFAULTS = {<class 'django.db.models.AutoField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.BooleanField'>: {'filter_class': <class 'django_filters.filters.BooleanFilter'>}, <class 'django.db.models.CharField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.CommaSeparatedIntegerField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.DateField'>: {'filter_class': <class 'django_filters.filters.DateFilter'>}, <class 'django.db.models.DateTimeField'>: {'filter_class': <class 'django_filters.filters.DateTimeFilter'>}, <class 'django.db.models.DecimalField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.DurationField'>: {'filter_class': <class 'django_filters.filters.DurationFilter'>}, <class 'django.db.models.EmailField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.FilePathField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.FloatField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.ForeignKey'>: {'extra': <function <lambda>>, 'filter_class': <class 'django_filters.filters.ModelChoiceFilter'>}, <class 'django.db.models.GenericIPAddressField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.IntegerField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.ManyToManyField'>: {'extra': <function <lambda>>, 'filter_class': <class 'django_filters.filters.ModelMultipleChoiceFilter'>}, <class 'django.db.models.NullBooleanField'>: {'filter_class': <class 'django_filters.filters.BooleanFilter'>}, <class 'django.db.models.OneToOneField'>: {'extra': <function <lambda>>, 'filter_class': <class 'django_filters.filters.ModelChoiceFilter'>}, <class 'django.db.models.PositiveIntegerField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.PositiveSmallIntegerField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.SlugField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.SmallIntegerField'>: {'filter_class': <class 'django_filters.filters.NumberFilter'>}, <class 'django.db.models.TextField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.TimeField'>: {'filter_class': <class 'django_filters.filters.TimeFilter'>}, <class 'django.db.models.URLField'>: {'filter_class': <class 'django_filters.filters.CharFilter'>}, <class 'django.db.models.UUIDField'>: {'filter_class': <class 'django_filters.filters.UUIDFilter'>}, <class 'django.db.models.fields.reverse_related.ManyToManyRel'>: {'extra': <function <lambda>>, 'filter_class': <class 'django_filters.filters.ModelMultipleChoiceFilter'>}, <class 'django.db.models.fields.reverse_related.ManyToOneRel'>: {'extra': <function <lambda>>, 'filter_class': <class 'django_filters.filters.ModelMultipleChoiceFilter'>}, <class 'django.db.models.fields.reverse_related.OneToOneRel'>: {'extra': <function <lambda>>, 'filter_class': <class 'django_filters.filters.ModelChoiceFilter'>}, <class 'django_enum.fields.EnumField'>: {'extra': <function FilterSet.<lambda>>, 'filter_class': <class 'django_enum.filters.EnumFilter'>}, <class 'django_enum.fields.FlagField'>: {'extra': <function FilterSet.<lambda>>, 'filter_class': <class 'django_enum.filters.EnumFlagFilter'>}}
_meta = <django_filters.filterset.FilterSetOptions object>
base_filters = {}
declared_filters = {}
static enum_extra(f: EnumField) Dict[str, Any][source]
classmethod filter_for_lookup(field: Field, lookup_type: str) Tuple[Type[Filter] | None, Dict[str, Any]][source]

For EnumFields use the EnumFilter class by default

class django_enum.filters.MultipleEnumFilter(*, enum: Type[Enum], strict: bool = True, conjoined: bool = False, **kwargs)[source]

Bases: TypedMultipleChoiceFilter

Use this filter class instead of MultipleChoiceFilter to get filters to accept multiple Enum labels and symmetric properties.

Parameters:
  • enum – The class of the enumeration containing the values to filter on

  • strict – If False (default), values not in the enumeration will be searchable.

  • conjoined – If True require all values to be present, if False require any

  • kwargs – Any additional arguments from base classes, (TypedMultipleChoiceFilter)

__init__(*, enum: Type[Enum], strict: bool = True, conjoined: bool = False, **kwargs)[source]
enum: Type[Enum]
field_class

alias of EnumMultipleChoiceField

strict: bool