Skip to main content

Django Filter extension to support filtering by Properties

Project description

Django Property Filter

Django-property-filter is an extension to django-filter and provides functionality to filter querysets by class properties.

It does so by providing sub-classes for Filters and Filtersets to keep existing django-filter functionality.

License Version
Travis CI Coverage
Wheel Implementation
Status Downloads
Supported versions

For more details and examples check the documentation.

Requirements

  • Python 3.8
  • Django-filter 2.20

Installation

Install using pip:

pip install django-property-filter

Then add 'django_property_filter' to your INSTALLED_APPS.

INSTALLED_APPS = [
    ...
    'django_property_filter',
]

Usage

Example Model

Our Model

from django.db import models

class BookSeries(models.Model):
    name = models.CharField(max_length=255)

    @property
    def book_count(self):
      return Book.objects.filter(series=self).count()

class Book(models.Model):
    title = models.CharField(max_length=255)
    price = models.DecimalField()
    discount_percentage = models.IntegerField()
    author = models.TextField()
    series = models.ForeignKey(BookSeries)

    @property
    def discounted_price(self):
      return self.price * self.discount_percentage \ 100

Implicit Filter Creation

If we want to filter by discounted price as well as number of books in a series, which both are properties and not fields in the database, we would do the following.::

from django_property_filter import (
  PropertyFilterSet,
  PropertyNumberFilter
)

class BookFilterSet(PropertyFilterSet):

  class Meta:
      model = Book
      exclude = ['price']
      property_fields = [
        ('discounted_price', PropertyNumberFilter, ['lt', 'exact']),
        ('series.book_count.', PropertyNumberFilter, ['gt', 'exact']),
      ]

This will create 4 Filters 1.) A "less than" and an "exact" filter for the "discounted_price" property of the Book Model 2.) A "greater than" and an "exact" filter for the "book_count" property of the related Model "series".

Since PropertyFilterSet is and extension to django-filter's Filterset which requires either the Meta attribute "fields" or "exclude" to be set we excluded the "price" field. If we had instead used:: fields = ['price']

It would also have created an "exact" filter for the book price.

The only difference to using a normal FilterSet from django-filter is the "property_fields" field.

The "property_fields" is a list of tuples with 3 values. 1.) The property name. If the property is on a related Model it should be separated by ".", and can span multiple levels e.g. fk.fk.fk.property 2.) The specific Property Filter to use. This is necessary since it can't be determined what the return type of the property will be in all cases 3.) The list of lookup expressions.

Explicit Filter Creation

It is also possible to create Filters explicitely. To do this we can either use FilterSet or PropertyFilterSet.

Using Filterset::

from django_filters import FilterSet
from django_property_filter import PropertyNumberFilter

class BookFilterSet(FilterSet):
    prop_number = PropertyNumberFilter(property_fld_name='discounted_price', lookup_expr='gte')

    class Meta:
        model = NumberClass
        fields = ['prop_number']

This creates a "greater than or equel" filter for the discounted_price property

The same can be achieved using a PropertyFilterSet::

from django_property_filter import PropertyNumberFilter, PropertyFilterSet

class BookFilterSet(PropertyFilterSet):
    prop_number = PropertyNumberFilter(property_fld_name='discounted_price', lookup_expr='gte')

    class Meta:
        model = NumberClass
        fields = ['prop_number']

Development

Run the Django Test Project to see the filters in action

  • go to "tests\django_test_proj"
  • run "python manage.py runserver"

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-property-filter-0.2.tar.gz (9.0 kB view details)

Uploaded Source

Built Distributions

django_property_filter-0.2.0-py2.py3-none-any.whl (10.0 kB view details)

Uploaded Python 2 Python 3

django_property_filter-0.2-py2.py3-none-any.whl (9.9 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file django-property-filter-0.2.tar.gz.

File metadata

  • Download URL: django-property-filter-0.2.tar.gz
  • Upload date:
  • Size: 9.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for django-property-filter-0.2.tar.gz
Algorithm Hash digest
SHA256 184490dcd60eb4a9dcb0142d776e79d193ccecbdc4f9a692ca4bdd0084c51ea1
MD5 49511515896f8cbaf6dff1ff9e93b957
BLAKE2b-256 542e21886b31bf9d76bbc498d11f3506e91715614b53f94d3a7c57db2efd28e0

See more details on using hashes here.

Provenance

File details

Details for the file django_property_filter-0.2.0-py2.py3-none-any.whl.

File metadata

  • Download URL: django_property_filter-0.2.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 10.0 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for django_property_filter-0.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 417d34a376f21f7839c117d7713607a34f02e3ff68d1baac2b7e82baef2f9787
MD5 bef9465e02a906a9b38aa58826db8e2d
BLAKE2b-256 a6acf3fda51f66eab2a198c862d73fad13e1a6522a4054c53655aeb4bca9af91

See more details on using hashes here.

Provenance

File details

Details for the file django_property_filter-0.2-py2.py3-none-any.whl.

File metadata

  • Download URL: django_property_filter-0.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 9.9 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.1 CPython/3.8.3

File hashes

Hashes for django_property_filter-0.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 3a7545b0d461a17b33535ca84ddc6fbef5d4e550e5b0ae4c83410f9e7a20e202
MD5 27cef847c1780a7f53a80a70b6471e7e
BLAKE2b-256 37bd8f465bd074d7cd0c540e5a99cb1ec9421810b4839df98f90c03fd1b765b2

See more details on using hashes here.

Provenance

Supported by

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