Filter ====== Base class: :doc:`Part` Class that describes a filter that you can search for. See :doc:`Query` for more complete examples. Parameters with the prefix `field__` will be passed along downstream to the `Field` instance if applicable. This can be used to tweak the basic style interface. Refinable members ----------------- `after`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Type: `int | str` See :ref:`after ` `assets` ^^^^^^^^ Type: `Namespace` See :ref:`assets ` `attr`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ See :ref:`attr ` Cookbook: :ref:`control-q` `choices`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cookbook: :ref:`filter-gui-field` `config_from_model` ^^^^^^^^^^^^^^^^^^^ Type: `Namespace` `endpoints` ^^^^^^^^^^^ Type: `Namespace` See :ref:`endpoints ` `extra` ^^^^^^^ Type: `dict[str, Any]` See :ref:`extra ` `extra_evaluated` ^^^^^^^^^^^^^^^^^ Type: `dict[str, Any]` See :ref:`extra ` `extra_params` ^^^^^^^^^^^^^^ See :ref:`extra_params ` `field` ^^^^^^^ Type: `Namespace` Cookbook: :ref:`multi-select-filters` :ref:`filter-gui-field` `freetext`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cookbook: :ref:`freetext-column` `include`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Type: `bool` See :ref:`include ` Cookbook: :ref:`filter-column` `iommi_style` ^^^^^^^^^^^^^ Type: `str | Style | None` See :ref:`iommi_style ` `is_valid_filter` ^^^^^^^^^^^^^^^^^ Default: `iommi.query.default_filter__is_valid_filter` Cookbook: :ref:`filter-matching` `model`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Type: `type[Model] | None` Cookbook: :ref:`filter-matching` `model_field` ^^^^^^^^^^^^^ Cookbook: :ref:`filter-matching` `model_field_name` ^^^^^^^^^^^^^^^^^^ Cookbook: :ref:`filter-matching` `parse` ^^^^^^^ Cookbook: :ref:`filter-matching` `pk_lookup_to_q` ^^^^^^^^^^^^^^^^ Cookbook: :ref:`filter-matching` `query_name`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Default: `lambda filter, **_: filter.iommi_name()` Cookbook: :ref:`control-q` `query_operator_for_field`     (:ref:`evaluated `) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Type: `str` Default: `=` Cookbook: :ref:`filter-matching` `query_operator_to_q_operator` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Cookbook: :ref:`override-operator` `search_fields` ^^^^^^^^^^^^^^^ Cookbook: :ref:`filter-gui-field` `unary` ^^^^^^^ Cookbook: :ref:`filter-matching` `value_to_q` ^^^^^^^^^^^^ Cookbook: :ref:`control-q` Shortcuts --------- `Filter.boolean` ^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `boolean` * `parse` * `iommi.form.bool_parse` * `unary` * `True` * `query_operator_to_q_operator` * `iommi.query.boolean__query_operator_to_q_operator` `Filter.boolean_tristate` ^^^^^^^^^^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `boolean_tristate` * `parse` * `iommi.form.boolean_tristate__parse` * `query_operator_to_q_operator` * `iommi.query.boolean__query_operator_to_q_operator` * `unary` * `True` `Filter.case_sensitive` ^^^^^^^^^^^^^^^^^^^^^^^ Defaults ++++++++ * `query_operator_to_q_operator` * `iommi.query.case_sensitive_query_operator_to_q_operator` `Filter.choice` ^^^^^^^^^^^^^^^ Field that has one value out of a set. Defaults ++++++++ * `field__call_target__attribute` * `choice` `Filter.choice_queryset` ^^^^^^^^^^^^^^^^^^^^^^^^ Field that has one value out of a set. Defaults ++++++++ * `field__call_target__attribute` * `choice_queryset` * `query_operator_to_q_operator` * `lambda op: 'exact'` * `value_to_q` * `iommi.query.choice_queryset_value_to_q` * `is_valid_filter` * `iommi.query.choice_queryset__is_valid_filter` `Filter.date` ^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `date` * `parse` * `iommi.form.date_parse` `Filter.datetime` ^^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `date` * `parse` * `iommi.form.date_parse` * `extra_evaluated__is_tz_aware` * `lambda **_: settings.USE_TZ` `Filter.decimal` ^^^^^^^^^^^^^^^^ Parent: Filter.number_ Defaults ++++++++ * `field__call_target__attribute` * `decimal` `Filter.duration` ^^^^^^^^^^^^^^^^^ Parent: Filter.text_ Defaults ++++++++ * `field__call_target__attribute` * `duration` `Filter.email` ^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `email` `Filter.file` ^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `file` `Filter.float` ^^^^^^^^^^^^^^ Parent: Filter.number_ Defaults ++++++++ * `field__call_target__attribute` * `float` * `parse` * `iommi.form.float_parse` `Filter.foreign_key` ^^^^^^^^^^^^^^^^^^^^ `Filter.foreign_key_reverse` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `foreign_key_reverse` * `extra__django_related_field` * `True` `Filter.integer` ^^^^^^^^^^^^^^^^ Parent: Filter.number_ Defaults ++++++++ * `field__call_target__attribute` * `integer` * `parse` * `iommi.form.int_parse` `Filter.many_to_many` ^^^^^^^^^^^^^^^^^^^^^ `Filter.many_to_many_reverse` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Filter.multi_choice` ^^^^^^^^^^^^^^^^^^^^^ Field that has one value out of a set. Defaults ++++++++ * `field__call_target__attribute` * `multi_choice` `Filter.multi_choice_queryset` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `multi_choice_queryset` Cookbook: :ref:`filter-multi-select` `Filter.number` ^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `number` * `query_operator_to_q_operator` * `iommi.query.case_sensitive_query_operator_to_q_operator` `Filter.related` ^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `related` * `choices` * `iommi.query.related__choices` Cookbook: :ref:`filter-multi-select` `Filter.related_multiple` ^^^^^^^^^^^^^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `many_to_many` * `choices` * `iommi.query.related__choices` * `extra__django_related_field` * `True` `Filter.text` ^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `text` * `query_operator_for_field` * `:` `Filter.textarea` ^^^^^^^^^^^^^^^^^ Parent: Filter.text_ `Filter.time` ^^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `time` * `parse` * `iommi.form.time_parse` `Filter.url` ^^^^^^^^^^^^ Defaults ++++++++ * `field__call_target__attribute` * `url` Methods ------- `on_bind` ^^^^^^^^^ `on_refine_done` ^^^^^^^^^^^^^^^^ `own_evaluate_parameters` ^^^^^^^^^^^^^^^^^^^^^^^^^ Class methods ------------- `checkboxes` ^^^^^^^^^^^^ `from_model` ^^^^^^^^^^^^ Create a `Filter` from a Django model field. When used declaratively inside a `Query`, you normally don't need to pass anything: the model is taken from the containing query and the model field name from the filter's own name. This works because resolution is deferred until the query is bound, by which point both are known. .. code-block:: python class AlbumQuery(Query): name = Filter.from_model() Pass `attr` (using `__` to drill down) to read a field from a related model: .. code-block:: python class AlbumQuery(Query): artist_name = Filter.from_model(attr='artist__name') The explicit `model`, `model_field_name` and `model_field` parameters are still accepted for the rare cases where the field can't be inferred from context (e.g. when not declared on a query), but are no longer required.