Skip to content

hodossy/django-nlf

Repository files navigation

PyPi Version PyPi Downloads Tests Weekly Documentation Code style: black Total alerts Language grade: Python

Django Natural Language Filter

Django NLF provides a simple and easy way to express complex filtering criteria with a filtering language as close to natural language as possible, while providing APIs to further customize the user experience.

Installation

Install using pip,

pip install django-nlf

And add django_nlf to your INSTALLED_APPS.

INSTALLED_APPS = [
    ...
    "django_nlf",
]

Then you can use the DjangoNLFilter with a queryset and a string, containing the filter expression. Please see the Language Reference for more details.

from django_nlf.filters import DjangoNLFilter
from .models import Article

nl_filter = DjangoNLFilter()
qs = Article.objects.all()
q = "author.username is john or title contains news"
# equivalent to Article.objects.filter(Q(author__username="john") | Q(title__icontains="news"))
articles = nl_filter.filter(qs, q)

# Nested logical operators are also supported:
q = "author.username is john and (title contains news or created_at <= 2020-06-05)"
# equivalent to
# Article.objects.filter(
#   Q(author__username="john") & (Q(title__icontains="news") | Q(created_at__lte="2020-06-05"))
# )
articles = nl_filter.filter(qs, q)

Django REST framework integration

Simply add the natural language filter backend to your filter backends list.

REST_FRAMEWORK = {
  "DEFAULT_FILTER_BACKENDS": (
    "django_nlf.rest_framework.DjangoNLFilterBackend",
  ),
}