Skip to main content

drf-url-filters

drf-url-filters is a simple django app to apply filters on drf modelviewset’s queryset in a clean, simple and configurable way. It also supports validations on incoming query params and their values. A beautiful python package voluptouos is being used for validations on the incoming query parameters. The best part about voluptouos is you can define your own validations as per your query params requirements.

# Quick start

Installation

  1. Download drf-url-filters app package from this git repo or can be installed using python-pip like pip install drf-url-filters.

  2. Add filters in INSTALLED_APPS of settings.py file of django project.

How it works

  1. Your View or ModelViewSet should inherit FiltersMixin from filters.mixins.FiltersMixin.

  2. To apply filters using drf-url-filters we need to configure our view to have a dict mapping filter_mappings which converts incoming query parameters to query you want to make on the column name on the queryset.

  3. Optionally, to perform any preprocessing on the incoming values for query params, add another dict filter_value_transformations which maps incoming query parameters to functions that should be applied to the values corresponding to them. The resultant value is used in the final filtering.

validations.py

import six

from filters.schema import base_query_params_schema
from filters.validations import (
    CSVofIntegers,
    IntegerLike,
    DatetimeWithTZ
)

# make a validation schema for players filter query params
players_query_schema = base_query_param_schema.extend(
    {
        "id": IntegerLike(),
        "name": six.text_type,  # Depends on python version
        "team_id": CSVofIntegers(),  # /?team_id=1,2,3
        "install_ts": DatetimeWithTZ(),
        "update_ts": DatetimeWithTZ(),
        "taller_than": IntegerLike(),
    }
)

views.py

from rest_framework import (
    viewsets,
    filters,
)

from .models import Player, Team
from .pagination import ResultSetPagination
from .serializers import PlayerSerializer, TeamSerializer
from .validations import teams_query_schema, players_query_schema
from filters.mixins import (
    FiltersMixin,
)


class PlayersViewSet(FiltersMixin, viewsets.ModelViewSet):
    """
    This viewset automatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.
    """
    queryset = Player.objects.prefetch_related(
        'teams'  # use prefetch_related to minimize db hits.
    ).all()
    serializer_class = PlayerSerializer
    pagination_class = ResultSetPagination
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('id', 'name', 'update_ts')
    ordering = ('id',)

    # add a mapping of query_params to db_columns(queries)
    filter_mappings = {
        'id': 'id',
        'name': 'name__icontains',
        'team_id': 'teams',
        'install_ts': 'install_ts',
        'update_ts': 'update_ts',
        'update_ts__gte': 'update_ts__gte',
        'update_ts__lte': 'update_ts__lte',
        'taller_than': 'height__gte',
    }

    field_value_transformations = {
        'taller_than': lambda val: val / 30.48  # cm to ft
    }

    # add validation on filters
    filter_validation_schema = players_query_schema

With the use of drf-url-filters adding a new filter on a new column is as simple as adding a new key in the dict. Prohibitting a filter on particular column is same as removing a key value mapping from the filter_mappings dict.

LICENSE

MIT License Copyright (c) 2016 Manjit Kumar.

Credits

Special thanks to authors of voluptouos and friends cdax and saurabhjha who encourage people to contribute into open source community.

Support

Please [open an issue] (https://github.com/manjitkumar/drf-url-filters/issues/new) for support.

Release files for drf-url-filters 0.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for drf-url-filters 0.5.1
File Size Uploaded
drf-url-filters-0.5.1.tar.gz 8.3 kB Details

Release files / drf-url-filters-0.5.1.tar.gz

Download URL drf-url-filters-0.5.1.tar.gz
Size 8.3 kB
Tags Source
SHA-256 checksum
How to use checksums
fdae4c970fd8ec7b19be825e238490d57b6155c76731732ed5edb250b044f973
BLAKE2b-256 checksum
How to use checksums
efe52eb2289a5fa80583721ed8a6d471eb72143d37bdbe68dcf577f02ec48c64
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

This release

0.5.1 This release

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

0.1.0

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page