Skip to main content

Allows users to filter Django models

Project description

Django Filtering

A library for filtering Django Models.

The original usecase for this project required the following:

  • provides a means of allowing users to filter modeled data
  • provides the ability to group filters by AND, OR and NOT operators
  • serializes, validates, etc.

A user interface (UI) is available for this package in the django-filtering-ui package.

State of development

This package is very much a work-in-progress. All APIs are completely unstable.

Installation

Install via pip or the preferred package manager:

pip install django-filtering

Add to the Django project's INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    'django_filtering',
    # ...
]

Usage

Say you have a Post model that you want users to be able to filter. We'd start by creating a FilterSet.

import django_filtering as filtering

class PostFilterSet(filtering.FilterSet):
    title = filtering.Filter(
        filtering.InputLookup('icontains', label="contains"),
        label="Title",
    )
    author = filtering.Filter(
        filtering.InputLookup('fullname__iexact', label="fullname is"),
        filtering.InputLookup('email__iexact', label="email is"),
        label="Author",
    )
    content = filtering.Filter(
        filtering.InputLookup('icontains', label="contains"),
        label="Content",
    )

    class Meta:
        model = Post

This can also be expressed using the declarative style:

class PostFilterSet(filtering.FilterSet):
    class Meta:
        model = Post
        fields = {
            'title': ['icontains'],
            'author': ['fullname__iexact', 'email__iexact'],
            'content': ['icontains'],
        }

Note, this package does not come with an interface for user filtering. The django-filtering-ui package does provide an interface.

The filters can be posted in a Form. For example, we'll say we have a form that has a single q JSON field.

q = [
    'and',
    [
        ['title', {'lookup': 'icontains', 'value': 'foo'}],
        ['content', {'lookup': 'icontains', 'value': 'bar'}],
    ]
]

The basic structure is an array with an operator and array of further criteria, where that can be a filter array or another operator grouping.

An example of a user posting filters could look like the following url:

/posts/?q=["and",[["title",{"lookup":"icontains","value":"foo"}],["content",{"lookup":"icontains","value":"bar"}]]

In this case we have a q query string value with JSON content. This query data structure is documented in more detail later in this document.

Let's say this url is a listing view for Post objects, something that looks like:

def posts_list(request):
    query_data = json.loads(request.GET.get('q', '[]'))
    filterset = PostFilterSet(query_data)
    queryset = filterset.filter_queryset()
    return HttpResponse('\n'.join([o.get_absolute_url() for o in queryset]))

In this example view we use the PostFilterSet with the query string value. We get the fitlered results by calling the <FilterSet>.filter_queryset method.

About the query data structure

The JSON serialiable query data is a loosely lisp'ish data structure that looks something like:

query-data := [<operator>, [<filter|operator>,...]]
operator := 'and' | 'or' | 'not' | 'xor'
filter := [<field-name>, {"lookup": <lookup>, "value": <value>}]
field-name := string
lookup := string
value := any

Note, the value can be of any JSON serialiable type.

Testing

Note, I'm testing within a docker container, because I never run anything locally. For the moment the container is simply run with:

docker run --rm --name django-filtering --workdir /code -v $PWD:/code -d python:3.12 sleep infinity

Then I execute commands on the shell within it:

docker exec django-filtering pip install -e '.[tests]'
docker exec -it django-filtering bash

Within the container's shell you can now execute pytest.

License

GPL v3 (see LICENSE file)

Copyright

© 2025 The Shadowserver Foundation

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_filtering-0.6.2.tar.gz (48.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_filtering-0.6.2-py3-none-any.whl (32.6 kB view details)

Uploaded Python 3

File details

Details for the file django_filtering-0.6.2.tar.gz.

File metadata

  • Download URL: django_filtering-0.6.2.tar.gz
  • Upload date:
  • Size: 48.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.12

File hashes

Hashes for django_filtering-0.6.2.tar.gz
Algorithm Hash digest
SHA256 3573e13fd02216d90245820376e6f658d4ff8f37a56fb104f14ee6bbd1c4a679
MD5 1d77daa9f11fcdee1f3b93c4f197226d
BLAKE2b-256 05ee23c1b6929afcd52cfaa7b5f3927d2a57aeccd7ebfdd254f0e84eb6bdbf9b

See more details on using hashes here.

File details

Details for the file django_filtering-0.6.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_filtering-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d9a8ba17fab4125c63c16e14193af6f677abb281424bc0bf2a547d3c5b20d68a
MD5 a8ba0d702d5204f866969a999f1e34f6
BLAKE2b-256 1adc353623615ea47b708c88a3c82347bf3acb2e4a8b9e1b1f173c7c1b46ac39

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page