# Django Opensearch DSL Filtering
A filtering system for Opensearch documents similar to django-filter, but designed to work with Opensearch queries instead of Django ORM.
## Installation
```bash
pip install django-opensearch-dsl-filtering
```
## Features
- Filter Opensearch documents using a familiar Django-like API
- Generate Django forms for your filters automatically
- Support for pagination and sorting
- Various filter types: CharFilter, NumericFilter, RangeFilter, DateFilter, BooleanFilter
## Quick Start
### Define a Document FilterSet
```python
from django_opensearch_dsl import Document
from django_opensearch_dsl_filtering import CharFilter, DateFilter, DocumentFilterSet, NumericFilter
# Assuming you have a Document class defined
class BookDocument(Document):
# Your document definition here
class Index:
name = "books"
class Django:
model = Book
fields = ["id"]
# Create a FilterSet for your document
class BookDocumentFilterSet(DocumentFilterSet):
document = BookDocument
# Define filters
title = CharFilter(field_name="title", lookup_expr="match", label="Title")
author = CharFilter(field_name="author", lookup_expr="match", label="Author")
publication_date = DateFilter(field_name="publication_date", label="Publication Date")
price = NumericFilter(field_name="price", label="Price")
price_min = NumericFilter(field_name="price", lookup_expr="gte", label="Min Price")
price_max = NumericFilter(field_name="price", lookup_expr="lte", label="Max Price")
# Define sorting options
SORT_CHOICES = [
("", "Default"),
("title", "Title (A-Z)"),
("-title", "Title (Z-A)"),
("price", "Price (Low to High)"),
("-price", "Price (High to Low)"),
]
```
### Use the FilterSet in a View
```python
from django.shortcuts import render
def book_search(request):
# Create a filter set with the request data
filter_set = BookDocumentFilterSet(data=request.GET)
# Get the search results
search = filter_set.search()
results = search.execute()
# Get the form for rendering in the template
form = filter_set.get_form()
return render(
request,
"books/search.html",
{
"form": form,
"results": results,
},
)
```
### Use the Form in a Template
```html
<form method="get">
{{ form.as_p }}
<button type="submit">Search</button>
</form>
<div class="results">
{% for result in results %}
<div class="result">
<h2>{{ result.title }}</h2>
<p>Author: {{ result.author }}</p>
<p>Price: ${{ result.price }}</p>
</div>
{% endfor %}
</div>
```
## Available Filters
- `CharFilter`: For text fields
- `NumericFilter`: For numeric fields
- `RangeFilter`: For numeric fields with a range
- `DateFilter`: For date fields
- `BooleanFilter`: For boolean fields
## Customizing Filters
Each filter can be customized with the following parameters:
- `field_name`: The name of the field to filter on
- `lookup_expr`: The lookup expression to use (e.g., "match", "term", "wildcard", "gt", "lt", etc.)
- `label`: The label to use for the form field
## License
MIT
Raw data
{
"_id": null,
"home_page": null,
"name": "django-opensearch-dsl-filtering",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "opensearch, django, filter, search",
"author": null,
"author_email": "Ben Atkinson <ben@streamlinedanalytics.co.uk>",
"download_url": "https://files.pythonhosted.org/packages/b7/ad/5bb3076de15a284cf2ba72285ce49a7a82f8b5985f5ea190773d28b751e8/django_opensearch_dsl_filtering-0.1.6.tar.gz",
"platform": null,
"description": "# Django Opensearch DSL Filtering\r\n\r\nA filtering system for Opensearch documents similar to django-filter, but designed to work with Opensearch queries instead of Django ORM.\r\n\r\n## Installation\r\n\r\n```bash\r\npip install django-opensearch-dsl-filtering\r\n```\r\n\r\n## Features\r\n\r\n- Filter Opensearch documents using a familiar Django-like API\r\n- Generate Django forms for your filters automatically\r\n- Support for pagination and sorting\r\n- Various filter types: CharFilter, NumericFilter, RangeFilter, DateFilter, BooleanFilter\r\n\r\n## Quick Start\r\n\r\n### Define a Document FilterSet\r\n\r\n```python\r\nfrom django_opensearch_dsl import Document\r\nfrom django_opensearch_dsl_filtering import CharFilter, DateFilter, DocumentFilterSet, NumericFilter\r\n\r\n# Assuming you have a Document class defined\r\nclass BookDocument(Document):\r\n # Your document definition here\r\n class Index:\r\n name = \"books\"\r\n\r\n class Django:\r\n model = Book\r\n fields = [\"id\"]\r\n\r\n# Create a FilterSet for your document\r\nclass BookDocumentFilterSet(DocumentFilterSet):\r\n document = BookDocument\r\n\r\n # Define filters\r\n title = CharFilter(field_name=\"title\", lookup_expr=\"match\", label=\"Title\")\r\n author = CharFilter(field_name=\"author\", lookup_expr=\"match\", label=\"Author\")\r\n publication_date = DateFilter(field_name=\"publication_date\", label=\"Publication Date\")\r\n price = NumericFilter(field_name=\"price\", label=\"Price\")\r\n price_min = NumericFilter(field_name=\"price\", lookup_expr=\"gte\", label=\"Min Price\")\r\n price_max = NumericFilter(field_name=\"price\", lookup_expr=\"lte\", label=\"Max Price\")\r\n\r\n # Define sorting options\r\n SORT_CHOICES = [\r\n (\"\", \"Default\"),\r\n (\"title\", \"Title (A-Z)\"),\r\n (\"-title\", \"Title (Z-A)\"),\r\n (\"price\", \"Price (Low to High)\"),\r\n (\"-price\", \"Price (High to Low)\"),\r\n ]\r\n```\r\n\r\n### Use the FilterSet in a View\r\n\r\n```python\r\nfrom django.shortcuts import render\r\n\r\ndef book_search(request):\r\n # Create a filter set with the request data\r\n filter_set = BookDocumentFilterSet(data=request.GET)\r\n\r\n # Get the search results\r\n search = filter_set.search()\r\n results = search.execute()\r\n\r\n # Get the form for rendering in the template\r\n form = filter_set.get_form()\r\n\r\n return render(\r\n request,\r\n \"books/search.html\",\r\n {\r\n \"form\": form,\r\n \"results\": results,\r\n },\r\n )\r\n```\r\n\r\n### Use the Form in a Template\r\n\r\n```html\r\n<form method=\"get\">\r\n {{ form.as_p }}\r\n <button type=\"submit\">Search</button>\r\n</form>\r\n\r\n<div class=\"results\">\r\n {% for result in results %}\r\n <div class=\"result\">\r\n <h2>{{ result.title }}</h2>\r\n <p>Author: {{ result.author }}</p>\r\n <p>Price: ${{ result.price }}</p>\r\n </div>\r\n {% endfor %}\r\n</div>\r\n```\r\n\r\n## Available Filters\r\n\r\n- `CharFilter`: For text fields\r\n- `NumericFilter`: For numeric fields\r\n- `RangeFilter`: For numeric fields with a range\r\n- `DateFilter`: For date fields\r\n- `BooleanFilter`: For boolean fields\r\n\r\n## Customizing Filters\r\n\r\nEach filter can be customized with the following parameters:\r\n\r\n- `field_name`: The name of the field to filter on\r\n- `lookup_expr`: The lookup expression to use (e.g., \"match\", \"term\", \"wildcard\", \"gt\", \"lt\", etc.)\r\n- `label`: The label to use for the form field\r\n\r\n## License\r\n\r\nMIT\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A filtering system for Opensearch documents similar to django-filter",
"version": "0.1.6",
"project_urls": {
"Bug Tracker": "https://github.com/yourusername/django-opensearch-dsl-filtering/issues",
"Homepage": "https://github.com/yourusername/django-opensearch-dsl-filtering"
},
"split_keywords": [
"opensearch",
" django",
" filter",
" search"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c3537814b70571b515de5e14566b22dfd30178387934d9b2b40887a6d8206641",
"md5": "52d54b26f07338a4c98d627674a8bb9e",
"sha256": "20a293a2da5a16c70cdd36f23b58107fec3e55699855b2470e3bac44c0741a33"
},
"downloads": -1,
"filename": "django_opensearch_dsl_filtering-0.1.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "52d54b26f07338a4c98d627674a8bb9e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 7212,
"upload_time": "2025-10-22T11:44:28",
"upload_time_iso_8601": "2025-10-22T11:44:28.113905Z",
"url": "https://files.pythonhosted.org/packages/c3/53/7814b70571b515de5e14566b22dfd30178387934d9b2b40887a6d8206641/django_opensearch_dsl_filtering-0.1.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b7ad5bb3076de15a284cf2ba72285ce49a7a82f8b5985f5ea190773d28b751e8",
"md5": "005e5cc2a11e0dd4e3a74d69d183f9c1",
"sha256": "1c909c055c07040048e09ac2f545fd1f845068f4fe2898183a114309cc216cea"
},
"downloads": -1,
"filename": "django_opensearch_dsl_filtering-0.1.6.tar.gz",
"has_sig": false,
"md5_digest": "005e5cc2a11e0dd4e3a74d69d183f9c1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 7839,
"upload_time": "2025-10-22T11:44:29",
"upload_time_iso_8601": "2025-10-22T11:44:29.494966Z",
"url": "https://files.pythonhosted.org/packages/b7/ad/5bb3076de15a284cf2ba72285ce49a7a82f8b5985f5ea190773d28b751e8/django_opensearch_dsl_filtering-0.1.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-22 11:44:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "yourusername",
"github_project": "django-opensearch-dsl-filtering",
"github_not_found": true,
"lcname": "django-opensearch-dsl-filtering"
}