django-mongoengine-filter
is a reusable Django application for allowing
users to filter mongoengine querysets dynamically. It's very similar to
popular django-filter
library and is designed to be used as a drop-in
replacement (as much as it's possible) strictly tied to MongoEngine
.
Full documentation on Read the docs.
- Python 3.7, 3.8, 3.9, 3.10 or 3.11.
- MongoDB 3.x, 4.x, 5.x.
- Django 2.2, 3.0, 3.1, 3.2, 4.0 or 4.1.
Install using pip:
pip install django-mongoengine-filter
Or latest development version:
pip install https://github.com/barseghyanartur/django-mongoengine-filter/archive/master.zip
Sample document
from mongoengine import fields, document
from .constants import PROFILE_TYPES, PROFILE_TYPE_FREE, GENDERS, GENDER_MALE
class Person(document.Document):
name = fields.StringField(
required=True,
max_length=255,
default="Robot",
verbose_name="Name"
)
age = fields.IntField(required=True, verbose_name="Age")
num_fingers = fields.IntField(
required=False,
verbose_name="Number of fingers"
)
profile_type = fields.StringField(
required=False,
blank=False,
null=False,
choices=PROFILE_TYPES,
default=PROFILE_TYPE_FREE,
)
gender = fields.StringField(
required=False,
blank=False,
null=False,
choices=GENDERS,
default=GENDER_MALE
)
def __str__(self):
return self.name
Sample filter
import django_mongoengine_filter
class PersonFilter(django_mongoengine_filter.FilterSet):
profile_type = django_mongoengine_filter.StringFilter()
ten_fingers = django_mongoengine_filter.MethodFilter(
action="ten_fingers_filter"
)
class Meta:
model = Person
fields = ["profile_type", "ten_fingers"]
def ten_fingers_filter(self, queryset, name, value):
if value == 'yes':
return queryset.filter(num_fingers=10)
return queryset
Sample view
With function-based views:
def person_list(request):
filter = PersonFilter(request.GET, queryset=Person.objects)
return render(request, "dfm_app/person_list.html", {"object_list": filter.qs})
Or class-based views:
from django_mongoengine_filter.views import FilterView
class PersonListView(FilterView):
filterset_class = PersonFilter
template_name = "dfm_app/person_list.html"
Sample template
<ul>
{% for obj in object_list %}
<li>{{ obj.name }} - {{ obj.age }}</li>
{% endfor %}
</ul>
Sample requests
- GET /persons/
- GET /persons/?profile_type=free&gender=male
- GET /persons/?profile_type=free&gender=female
- GET /persons/?profile_type=member&gender=female
- GET /persons/?ten_fingers=yes
To run tests in your working environment type:
pytest -vrx
To test with all supported Python versions type:
tox
The easiest way is to run it via Docker:
docker pull mongo:latest
docker run -p 27017:27017 mongo:latest
Keep the following hierarchy.
=====
title
=====
header
======
sub-header
----------
sub-sub-header
~~~~~~~~~~~~~~
sub-sub-sub-header
^^^^^^^^^^^^^^^^^^
sub-sub-sub-sub-header
++++++++++++++++++++++
sub-sub-sub-sub-sub-header
**************************
GPL-2.0-only OR LGPL-2.1-or-later
For any security issues contact me at the e-mail given in the Author section.
For overall issues, go to GitHub.
Artur Barseghyan <[email protected]>