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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 184490dcd60eb4a9dcb0142d776e79d193ccecbdc4f9a692ca4bdd0084c51ea1 |
|
MD5 | 49511515896f8cbaf6dff1ff9e93b957 |
|
BLAKE2b-256 | 542e21886b31bf9d76bbc498d11f3506e91715614b53f94d3a7c57db2efd28e0 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 417d34a376f21f7839c117d7713607a34f02e3ff68d1baac2b7e82baef2f9787 |
|
MD5 | bef9465e02a906a9b38aa58826db8e2d |
|
BLAKE2b-256 | a6acf3fda51f66eab2a198c862d73fad13e1a6522a4054c53655aeb4bca9af91 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3a7545b0d461a17b33535ca84ddc6fbef5d4e550e5b0ae4c83410f9e7a20e202 |
|
MD5 | 27cef847c1780a7f53a80a70b6471e7e |
|
BLAKE2b-256 | 37bd8f465bd074d7cd0c540e5a99cb1ec9421810b4839df98f90c03fd1b765b2 |