Skip to content
Elasticsearch support for Django REST Framework
Branch: master
Clone or download
myarik Merge pull request #42 from ArtemBernatskyy/master
Added ElasticPageNumberPagination
Latest commit 594a28c Mar 27, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
rest_framework_elasticsearch Added ElasticPageNumberPagination Mar 22, 2019
tests fixed tests for range filter fields Aug 27, 2018

Elasticsearch for Django REST Framework


Django REST Elasticsearch provides the easy way for integration Django REST Framework and Elasticsearch. The library uses Elasticsearch DSL library (elasticsearch-dsl-py) It is a high-level library to the official low-level client.


  • Django REST Framework 3.5 and above
  • elasticsearch-dsl>=5.0.0,<7.0.0 (Elasticsearch 5.x)


Let's take a look at a quick example of using Django REST Elasticsearch to build a simple application.

Install using pip...

pip install django-rest-elasticsearch

Let's create a simple Django model

class Blog(models.Model):
    title = models.CharField(_('Title'), max_length=1000)
    created_at = models.DateTimeField(_('Created at'), auto_now_add=True)
    body = models.TextField(_('Body'))
    tags = ArrayField(models.CharField(max_length=200), blank=True, null=True)
    is_published = models.BooleanField(_('Is published'), default=False)

    def __str__(self):
        return self.title

Create a DocType to represent our Blog model

class BlogIndex(DocType):
    pk = Integer()
    title = Text(fields={'raw': Keyword()})
    created_at = Date()
    body = Text()
    tags = Keyword(multi=True)
    is_published = Boolean()

    class Meta:
        index = 'blog'

After, create the mappings in Elasticsearch


Finally, create a view. The view provides search by a word in a title and filtering by tags.

from rest_framework_elasticsearch import es_views, es_pagination, es_filters

class BlogView(es_views.ListElasticAPIView):
    es_client = es_client
    es_model = BlogIndex
    es_pagination_class = es_pagination.ElasticLimitOffsetPagination
    es_filter_backends = (
    es_ordering = 'created_at'
    es_filter_fields = (
        es_filters.ESFieldFilter('tag', 'tags'),
    es_range_filter_fields = (
    es_search_fields = (

This will allow the client to filter the items in the list by making queries such as:,aws


Activate Virtual Environment virtualenvs.

$ virtualenv venv
$ source venv/bin/activate

To run all of the tests for django-rest-elasticsearch, run:

$ python test

Use the pytest for running scripts

  • Run all of the tests in test/
$ pytest tests/
  • Run only the TestElasticSearchFilter test.
$ pytest tests/

By default, the test connection is attempted at localhost:9200, based on the defaults specified in the elasticsearch-py Connection class. Elasticsearch instance at localhost:9200 does not meet these requirements, it is possible to specify a different test Elasticsearch server through the TEST_ES_SERVER environment variable.

$ TEST_ES_SERVER=my-test-server:9201 pytest

For running tests in ralease environments use tox

$ tox


Documentation is available at

You can’t perform that action at this time.