Skip to main content

Simple drop-in replacement for rest_framework.filters

Project description

django-simplefilters

This is a drop-in replacement for built-in Django Rest Framework filters package. It provides an easy way to retrieve params from the URL and use them to narrow results of the queryset.

The main difference with other solutions, i.e. django-filter, is that we do not try to handle each case and actual filtering is left for the user to implement. This might sound counterintuitive for a filtering library but we believe that in many cases it's much easier to write something like

class EntryFilterSet(filters.FilterSet):

    @filters.CharFilter(many=True)
    def filter_status(self, queryset, values):
        return queryset.filter(status__in=values)

than try to find this special case (multiple values) in your filtering library documentation.

Installation

$ pip install django-simplefilters

Usage

Let's imagine we have an Entry model with following attributes:

status_choices = ((c, c) for c in ['draft', 'published', 'archived'])

class Entry(models.Model):
    title = models.CharField(max_length=64)
    status = models.CharField(max_length=16, choices=status_choices)
    modified_at = models.DateTimeField(auto_now=True)

and we want to allow owner to filter entries by their status and modification date.

We need to define our filterset first:

# entries/filtersets.py
import simplefilters as filters


class Entry(filters.FilterSet):

    @filters.CharFilter()
    def filter_status(self, queryset, value):
        return queryset.filter(status=value)

    @filters.DateTimeFilter()
    def filter_modified_at_min(self, queryset, ts):
        return queryset.filter(modified_at__gte=ts)

    @filters.DateTimeFilter()
    def filter_modified_at_max(self, queryset, ts):
        return queryset.filter(modified_at__lte=ts)

Mostly this should be self-explanatory, however important bit is how we indicate url param. This is achieved similarly to validation in serializers: name of the parameter is prefixed with filter_ string. So, code above defines filters for following URL parameters: status, modified_at_min and modified_at_max.

Then hook it at corresponding ViewSet class:

# entries/views.py
from . import filtersets
from . import models
import simplefilters as filters


class EntryViewSet(ModelViewSet):
    serializer_class = ...
    filter_backends = [filters.DjangoFilterBackend]
    filter_class = filtersets.Entry

    class Meta:
        model = models.Entry

now user would be able to perform queries like:

GET /entries?status=draft
GET /entries?modified_at_min=2018-03-30T14:00Z
etc.

Supported filters

By definition, whatever user puts as query param is simply a string. Thus, CharFiled is simplest and most basic filter. But sometimes we would need to accept other types, i.e. numbers, timestamps or flags.

Here is a full list of available filters:

CharFilter

Most basic filter. Nothing fancy is done here.

IntegerFilter

Param is casted to integer.

FlagFilter

Param is casted to bool. Strings that would be treated as True indicator (case insensitive): yes, y, true, t and 1. Similarly, those would be treated as False: no, n, false, f and 0.

DateTimeFilter

Param is casted to datetime object.

Multiple params

Sometimes we want to pass multiple params from the url. In example, we might want to allow users to filter by multiple status values and perform something like:

GET /entries?status=draft&status=archived

For this to work, simply indicate that we want to use many values at the filter method definition:

  @filters.CharFilter(many=True)
  def filter_status(self, queryset, values):
      return queryset.filter(status__in=values)

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-simplefilters-1.0.0.tar.gz (4.5 kB view details)

Uploaded Source

Built Distribution

django_simplefilters-1.0.0-py3-none-any.whl (4.9 kB view details)

Uploaded Python 3

File details

Details for the file django-simplefilters-1.0.0.tar.gz.

File metadata

  • Download URL: django-simplefilters-1.0.0.tar.gz
  • Upload date:
  • Size: 4.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for django-simplefilters-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a9fbebc7a6c14c8835d687b125831d3de6ff857ad6192c8d4c6044e01e4d0828
MD5 2a8eb804b8a0c04b475f123a3756d83f
BLAKE2b-256 43009f43ce3c9708b2f77f41a2ded6488012d7ad396329ff85c26821220b3fc8

See more details on using hashes here.

File details

Details for the file django_simplefilters-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: django_simplefilters-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 4.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.8.10

File hashes

Hashes for django_simplefilters-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4200ee4273df294fadf762ea498a173efdff1bf0943e1b06549cb652f4bff577
MD5 66ee9835f5d61a1d7c5b6c7947766ee6
BLAKE2b-256 687c78029c6d9ad04c3d666a883e5070ed10af7258cafefb4044e2b7da64c0ff

See more details on using hashes here.

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