algoliasearch-django


Namealgoliasearch-django JSON
Version 3.0.0 PyPI version JSON
download
home_pagehttps://github.com/algolia/algoliasearch-django
SummaryAlgolia Search integration for Django
upload_time2023-04-28 07:10:02
maintainer
docs_urlNone
authorAlgolia Team
requires_python
licenseMIT License
keywords algolia pyalgolia search backend hosted cloud full-text search faceted search django
VCS
bugtrack_url
requirements django algoliasearch pypandoc wheel tox twine factory_boy mock
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <p align="center">
  <a href="https://www.algolia.com">
    <img alt="Algolia for Django" src="https://raw.githubusercontent.com/algolia/algoliasearch-client-common/master/banners/django.png" >
  </a>

  <h4 align="center">The perfect starting point to integrate <a href="https://algolia.com" target="_blank">Algolia</a> within your Django project</h4>

  <p align="center">
    <a href="https://travis-ci.org/algolia/algoliasearch-django"><img src="https://travis-ci.org/algolia/algoliasearch-django.svg?branch=master" alt="Build Status"></img></a>
    <a href="https://coveralls.io/r/algolia/algoliasearch-django"><img src="https://coveralls.io/repos/algolia/algoliasearch-django/badge.svg?branch=master" alt="Coverage Status"></img></a>
    <a href="http://badge.fury.io/py/algoliasearch-django"><img src="https://badge.fury.io/py/algoliasearch-django.svg?branch=master" alt="PyPi Version"></img></a>
  </p>
</p>


<p align="center">
  <a href="https://www.algolia.com/doc/framework-integration/django/options/?language=python" target="_blank">Documentation</a>  •
  <a href="https://discourse.algolia.com" target="_blank">Community Forum</a>  •
  <a href="http://stackoverflow.com/questions/tagged/algolia" target="_blank">Stack Overflow</a>  •
  <a href="https://github.com/algolia/algoliasearch-django/issues" target="_blank">Report a bug</a>  •
  <a href="https://www.algolia.com/doc/framework-integration/django/faq/" target="_blank">FAQ</a>  •
  <a href="https://www.algolia.com/support" target="_blank">Support</a>
</p>

## API Documentation

You can find the full reference on [Algolia's website](https://www.algolia.com/doc/framework-integration/django/).



1. **[Setup](#setup)**
    * [Introduction](#introduction)
    * [Install](#install)
    * [Setup](#setup)
    * [Quick Start](#quick-start)

1. **[Commands](#commands)**
    * [Commands](#commands)

1. **[Search](#search)**
    * [Search](#search)

1. **[Geo-Search](#geo-search)**
    * [Geo-Search](#geo-search)

1. **[Tags](#tags)**
    * [Tags](#tags)

1. **[Options](#options)**
    * [Custom <code>objectID</code>](#custom-codeobjectidcode)
    * [Custom index name](#custom-index-name)
    * [Field Preprocessing and Related objects](#field-preprocessing-and-related-objects)
    * [Index settings](#index-settings)
    * [Restrict indexing to a subset of your data](#restrict-indexing-to-a-subset-of-your-data)
    * [Multiple indices per model](#multiple-indices-per-model)
    * [Temporarily disable the auto-indexing](#temporarily-disable-the-auto-indexing)

1. **[Tests](#tests)**
    * [Run Tests](#run-tests)

1. **[Troubleshooting](#troubleshooting)**
    * [Frequently asked questions](#frequently-asked-questions)



# Setup



## Introduction

This package lets you easily integrate the Algolia Search API to your [Django](https://www.djangoproject.com/) project. It's based on the [algoliasearch-client-python](https://github.com/algolia/algoliasearch-client-python) package.

You might be interested in this sample Django application providing a typeahead.js based auto-completion and Google-like instant search: [algoliasearch-django-example](https://github.com/algolia/algoliasearch-django-example).

- Compatible with **Python 2.7** and **Python 3.4+**.
- Supports **Django 1.7+**, **2.x** and **3.x**.

## Install

```sh
pip install algoliasearch-django
```

## Setup

In your Django settings, add `algoliasearch_django` to `INSTALLED_APPS` and add these two settings:

```python
ALGOLIA = {
    'APPLICATION_ID': 'MyAppID',
    'API_KEY': 'MyApiKey'
}
```

There are several optional settings:

* `INDEX_PREFIX`: prefix all indices. Use it to separate different applications, like `site1_Products` and `site2_Products`.
* `INDEX_SUFFIX`: suffix all indices. Use it to differentiate development and production environments, like `Location_dev` and `Location_prod`.
* `AUTO_INDEXING`: automatically synchronize the models with Algolia (default to **True**).
* `RAISE_EXCEPTIONS`: raise exceptions on network errors instead of logging them (default to **settings.DEBUG**).

## Quick Start

Create an `index.py` inside each application that contains the models you want to index.
Inside this file, call `algoliasearch.register()` for each of the models you want to index:

```python
# index.py

import algoliasearch_django as algoliasearch

from .models import YourModel

algoliasearch.register(YourModel)
```

By default, all the fields of your model will be used. You can configure the index by creating a subclass of `AlgoliaIndex` and using the `register` decorator:

```python
# index.py

from algoliasearch_django import AlgoliaIndex
from algoliasearch_django.decorators import register

from .models import YourModel

@register(YourModel)
class YourModelIndex(AlgoliaIndex):
    fields = ('name', 'date')
    geo_field = 'location'
    settings = {'searchableAttributes': ['name']}
    index_name = 'my_index'

```



# Commands



## Commands

* `python manage.py algolia_reindex`: reindex all the registered models. This command will first send all the record to a temporary index and then moves it.
    * you can pass ``--model`` parameter to reindex a given model
* `python manage.py algolia_applysettings`: (re)apply the index settings.
* `python manage.py algolia_clearindex`: clear the index



# Search



## Search

We recommend using our [InstantSearch.js library](https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js/) to build your search
interface and perform search queries directly from the end-user browser without going through your server.

However, if you want to search from your backend you can use the `raw_search(YourModel, 'yourQuery', params)` method.
It retrieves the raw JSON answer from the API, and accepts in `param` any
[search parameters](https://www.algolia.com/doc/api-reference/search-api-parameters/).

```python
from algoliasearch_django import raw_search

params = { "hitsPerPage": 5 }
response = raw_search(Contact, "jim", params)
```



# Geo-Search



## Geo-Search

Use the `geo_field` attribute to localize your record. `geo_field` should be a callable that returns a tuple (latitude, longitude).

```python
class Contact(models.model):
    name = models.CharField(max_length=20)
    lat = models.FloatField()
    lng = models.FloatField()

    def location(self):
        return (self.lat, self.lng)

class ContactIndex(AlgoliaIndex):
    fields = 'name'
    geo_field = 'location'

algoliasearch.register(Contact, ContactIndex)
```



# Tags



## Tags

Use the `tags` attributes to add tags to your record. It can be a field or a callable.

```python
class ArticleIndex(AlgoliaIndex):
    tags = 'category'
```

At query time, specify `{ tagFilters: 'tagvalue' }` or `{ tagFilters: ['tagvalue1', 'tagvalue2'] }` as search parameters to restrict the result set to specific tags.



# Options



## Custom `objectID`

You can choose which field will be used as the `objectID `. The field should be unique and can
    be a string or integer. By default, we use the `pk` field of the model.

```python
class ArticleIndex(AlgoliaIndex):
    custom_objectID = 'post_id'
```

## Custom index name

You can customize the index name. By default, the index name will be the name of the model class.

```python
class ContactIndex(algoliaindex):
    index_name = 'Enterprise'
```

## Field Preprocessing and Related objects

If you want to process a field before indexing it (e.g. capitalizing a `Contact`'s `name`),
or if you want to index a [related object](https://docs.djangoproject.com/en/1.11/ref/models/relations/)'s
attribute, you need to define **proxy methods** for these fields.

### Models

```python
class Account(models.Model):
    username = models.CharField(max_length=40)
    service = models.CharField(max_length=40)

class Contact(models.Model):
    name = models.CharField(max_length=40)
    email = models.EmailField(max_length=60)
    //...
    accounts = models.ManyToManyField(Account)

    def account_names(self):
        return [str(account) for account in self.accounts.all()]

    def account_ids(self):
        return [account.id for account in self.accounts.all()]
```

### Index

```python
from algoliasearch_django import AlgoliaIndex

class ContactIndex(AlgoliaIndex):
    fields = ('name', 'email', 'company', 'address', 'city', 'county',
              'state', 'zip_code', 'phone', 'fax', 'web', 'followers', 'account_names', 'account_ids')

    settings = {
        'searchableAttributes': ['name', 'email', 'company', 'city', 'county', 'account_names',
        }
```

- With this configuration, you can search for a `Contact` using its `Account` names
- You can use the associated `account_ids` at search-time to fetch more data from your
model (you should **only proxy the fields relevant for search** to keep your records' size
as small as possible)

## Index settings

We provide many ways to configure your index allowing you to tune your overall index relevancy.
All the configuration is explained on [our doc](https://www.algolia.com/doc/api-reference/api-parameters/).

```python
class ArticleIndex(AlgoliaIndex):
    settings = {
        'searchableAttributes': ['name', 'description', 'url'],
        'customRanking': ['desc(vote_count)', 'asc(name)']
    }
```

## Restrict indexing to a subset of your data

You can add constraints controlling if a record must be indexed or not. `should_index` should be a
callable that returns a boolean.

```python
class Contact(models.model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()

    def is_adult(self):
        return (self.age >= 18)

class ContactIndex(AlgoliaIndex):
    should_index = 'is_adult'
```

## Multiple indices per model

It is possible to have several indices for a single model.

- First, define all your indices that you want for a model:

```python
from algoliasearch_django import AlgoliaIndex

class MyModelIndex1(AlgoliaIndex):
    name = 'MyModelIndex1'
    ...

class MyModelIndex2(AlgoliaIndex):
    name = 'MyModelIndex2'
    ...
```

- Then, define a meta model which will aggregate those indices:

```python
class MyModelMetaIndex(AlgoliaIndex):
    def __init__(self, model, client, settings):
        self.indices = [
            MyModelIndex1(model, client, settings),
            MyModelIndex2(model, client, settings),
        ]

    def raw_search(self, query='', params=None):
        res = {}
        for index in self.indices:
            res[index.name] = index.raw_search(query, params)
        return res

    def update_records(self, qs, batch_size=1000, **kwargs):
        for index in self.indices:
            index.update_records(qs, batch_size, **kwargs)

    def reindex_all(self, batch_size=1000):
        for index in self.indices:
            index.reindex_all(batch_size)

    def set_settings(self):
        for index in self.indices:
            index.set_settings()

    def clear_index(self):
        for index in self.indices:
            index.clear_index()

    def save_record(self, instance, update_fields=None, **kwargs):
        for index in self.indices:
            index.save_record(instance, update_fields, **kwargs)

    def delete_record(self, instance):
        for index in self.indices:
            index.delete_record(instance)
```

- Finally, register this `AlgoliaIndex` with your `Model`:

```python
import algoliasearch_django as algoliasearch
algoliasearch.register(MyModel, MyModelMetaIndex)
```

## Temporarily disable the auto-indexing

It is possible to temporarily disable the auto-indexing feature using the `disable_auto_indexing` context decorator:

```python
from algoliasearch_django.decorators import disable_auto_indexing

# Used as a context manager
with disable_auto_indexing():
    MyModel.save()

# Used as a decorator
@disable_auto_indexing():
my_method()

# You can also specifiy for which model you want to disable the auto-indexing
with disable_auto_indexing(MyModel):
    MyModel.save()
    MyOtherModel.save()

```



# Tests



## Run Tests

To run the tests, first find your Algolia application id and Admin API key (found on the Credentials page).

```shell
ALGOLIA_APPLICATION_ID={APPLICATION_ID} ALGOLIA_API_KEY={ADMIN_API_KEY} tox
```


To override settings for some tests, use the [settings method](https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.SimpleTestCase.settings):
```python
class OverrideSettingsTestCase(TestCase):
    def setUp(self):
        with self.settings(ALGOLIA={
            'APPLICATION_ID': 'foo',
            'API_KEY': 'bar',
            'AUTO_INDEXING': False
        }):
            algolia_engine.reset(settings.ALGOLIA)

    def tearDown(self):
        algolia_engine.reset(settings.ALGOLIA)

    def test_foo():
        # ...
```



# Troubleshooting

# Use the Dockerfile
If you want to contribute to this project without installing all its dependencies, you can use our Docker image. Please check our [dedicated guide](DOCKER_README.md) to learn more.

## Frequently asked questions

Encountering an issue? Before reaching out to support, we recommend heading to our [FAQ](https://www.algolia.com/doc/framework-integration/django/faq/) where you will find answers for the most common issues and gotchas with the package.



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/algolia/algoliasearch-django",
    "name": "algoliasearch-django",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "algolia,pyalgolia,search,backend,hosted,cloud,full-text search,faceted search,django",
    "author": "Algolia Team",
    "author_email": "support@algolia.com",
    "download_url": "https://files.pythonhosted.org/packages/f4/2d/afab04cee45ab9cb52be683d7a99cd424b9b87facf6f9eed53522b34ace3/algoliasearch-django-3.0.0.tar.gz",
    "platform": null,
    "description": "<p align=\"center\">\n  <a href=\"https://www.algolia.com\">\n    <img alt=\"Algolia for Django\" src=\"https://raw.githubusercontent.com/algolia/algoliasearch-client-common/master/banners/django.png\" >\n  </a>\n\n  <h4 align=\"center\">The perfect starting point to integrate <a href=\"https://algolia.com\" target=\"_blank\">Algolia</a> within your Django project</h4>\n\n  <p align=\"center\">\n    <a href=\"https://travis-ci.org/algolia/algoliasearch-django\"><img src=\"https://travis-ci.org/algolia/algoliasearch-django.svg?branch=master\" alt=\"Build Status\"></img></a>\n    <a href=\"https://coveralls.io/r/algolia/algoliasearch-django\"><img src=\"https://coveralls.io/repos/algolia/algoliasearch-django/badge.svg?branch=master\" alt=\"Coverage Status\"></img></a>\n    <a href=\"http://badge.fury.io/py/algoliasearch-django\"><img src=\"https://badge.fury.io/py/algoliasearch-django.svg?branch=master\" alt=\"PyPi Version\"></img></a>\n  </p>\n</p>\n\n\n<p align=\"center\">\n  <a href=\"https://www.algolia.com/doc/framework-integration/django/options/?language=python\" target=\"_blank\">Documentation</a>  \u2022\n  <a href=\"https://discourse.algolia.com\" target=\"_blank\">Community Forum</a>  \u2022\n  <a href=\"http://stackoverflow.com/questions/tagged/algolia\" target=\"_blank\">Stack Overflow</a>  \u2022\n  <a href=\"https://github.com/algolia/algoliasearch-django/issues\" target=\"_blank\">Report a bug</a>  \u2022\n  <a href=\"https://www.algolia.com/doc/framework-integration/django/faq/\" target=\"_blank\">FAQ</a>  \u2022\n  <a href=\"https://www.algolia.com/support\" target=\"_blank\">Support</a>\n</p>\n\n## API Documentation\n\nYou can find the full reference on [Algolia's website](https://www.algolia.com/doc/framework-integration/django/).\n\n\n\n1. **[Setup](#setup)**\n    * [Introduction](#introduction)\n    * [Install](#install)\n    * [Setup](#setup)\n    * [Quick Start](#quick-start)\n\n1. **[Commands](#commands)**\n    * [Commands](#commands)\n\n1. **[Search](#search)**\n    * [Search](#search)\n\n1. **[Geo-Search](#geo-search)**\n    * [Geo-Search](#geo-search)\n\n1. **[Tags](#tags)**\n    * [Tags](#tags)\n\n1. **[Options](#options)**\n    * [Custom <code>objectID</code>](#custom-codeobjectidcode)\n    * [Custom index name](#custom-index-name)\n    * [Field Preprocessing and Related objects](#field-preprocessing-and-related-objects)\n    * [Index settings](#index-settings)\n    * [Restrict indexing to a subset of your data](#restrict-indexing-to-a-subset-of-your-data)\n    * [Multiple indices per model](#multiple-indices-per-model)\n    * [Temporarily disable the auto-indexing](#temporarily-disable-the-auto-indexing)\n\n1. **[Tests](#tests)**\n    * [Run Tests](#run-tests)\n\n1. **[Troubleshooting](#troubleshooting)**\n    * [Frequently asked questions](#frequently-asked-questions)\n\n\n\n# Setup\n\n\n\n## Introduction\n\nThis package lets you easily integrate the Algolia Search API to your [Django](https://www.djangoproject.com/) project. It's based on the [algoliasearch-client-python](https://github.com/algolia/algoliasearch-client-python) package.\n\nYou might be interested in this sample Django application providing a typeahead.js based auto-completion and Google-like instant search: [algoliasearch-django-example](https://github.com/algolia/algoliasearch-django-example).\n\n- Compatible with **Python 2.7** and **Python 3.4+**.\n- Supports **Django 1.7+**, **2.x** and **3.x**.\n\n## Install\n\n```sh\npip install algoliasearch-django\n```\n\n## Setup\n\nIn your Django settings, add `algoliasearch_django` to `INSTALLED_APPS` and add these two settings:\n\n```python\nALGOLIA = {\n    'APPLICATION_ID': 'MyAppID',\n    'API_KEY': 'MyApiKey'\n}\n```\n\nThere are several optional settings:\n\n* `INDEX_PREFIX`: prefix all indices. Use it to separate different applications, like `site1_Products` and `site2_Products`.\n* `INDEX_SUFFIX`: suffix all indices. Use it to differentiate development and production environments, like `Location_dev` and `Location_prod`.\n* `AUTO_INDEXING`: automatically synchronize the models with Algolia (default to **True**).\n* `RAISE_EXCEPTIONS`: raise exceptions on network errors instead of logging them (default to **settings.DEBUG**).\n\n## Quick Start\n\nCreate an `index.py` inside each application that contains the models you want to index.\nInside this file, call `algoliasearch.register()` for each of the models you want to index:\n\n```python\n# index.py\n\nimport algoliasearch_django as algoliasearch\n\nfrom .models import YourModel\n\nalgoliasearch.register(YourModel)\n```\n\nBy default, all the fields of your model will be used. You can configure the index by creating a subclass of `AlgoliaIndex` and using the `register` decorator:\n\n```python\n# index.py\n\nfrom algoliasearch_django import AlgoliaIndex\nfrom algoliasearch_django.decorators import register\n\nfrom .models import YourModel\n\n@register(YourModel)\nclass YourModelIndex(AlgoliaIndex):\n    fields = ('name', 'date')\n    geo_field = 'location'\n    settings = {'searchableAttributes': ['name']}\n    index_name = 'my_index'\n\n```\n\n\n\n# Commands\n\n\n\n## Commands\n\n* `python manage.py algolia_reindex`: reindex all the registered models. This command will first send all the record to a temporary index and then moves it.\n    * you can pass ``--model`` parameter to reindex a given model\n* `python manage.py algolia_applysettings`: (re)apply the index settings.\n* `python manage.py algolia_clearindex`: clear the index\n\n\n\n# Search\n\n\n\n## Search\n\nWe recommend using our [InstantSearch.js library](https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js/) to build your search\ninterface and perform search queries directly from the end-user browser without going through your server.\n\nHowever, if you want to search from your backend you can use the `raw_search(YourModel, 'yourQuery', params)` method.\nIt retrieves the raw JSON answer from the API, and accepts in `param` any\n[search parameters](https://www.algolia.com/doc/api-reference/search-api-parameters/).\n\n```python\nfrom algoliasearch_django import raw_search\n\nparams = { \"hitsPerPage\": 5 }\nresponse = raw_search(Contact, \"jim\", params)\n```\n\n\n\n# Geo-Search\n\n\n\n## Geo-Search\n\nUse the `geo_field` attribute to localize your record. `geo_field` should be a callable that returns a tuple (latitude, longitude).\n\n```python\nclass Contact(models.model):\n    name = models.CharField(max_length=20)\n    lat = models.FloatField()\n    lng = models.FloatField()\n\n    def location(self):\n        return (self.lat, self.lng)\n\nclass ContactIndex(AlgoliaIndex):\n    fields = 'name'\n    geo_field = 'location'\n\nalgoliasearch.register(Contact, ContactIndex)\n```\n\n\n\n# Tags\n\n\n\n## Tags\n\nUse the `tags` attributes to add tags to your record. It can be a field or a callable.\n\n```python\nclass ArticleIndex(AlgoliaIndex):\n    tags = 'category'\n```\n\nAt query time, specify `{ tagFilters: 'tagvalue' }` or `{ tagFilters: ['tagvalue1', 'tagvalue2'] }` as search parameters to restrict the result set to specific tags.\n\n\n\n# Options\n\n\n\n## Custom `objectID`\n\nYou can choose which field will be used as the `objectID `. The field should be unique and can\n    be a string or integer. By default, we use the `pk` field of the model.\n\n```python\nclass ArticleIndex(AlgoliaIndex):\n    custom_objectID = 'post_id'\n```\n\n## Custom index name\n\nYou can customize the index name. By default, the index name will be the name of the model class.\n\n```python\nclass ContactIndex(algoliaindex):\n    index_name = 'Enterprise'\n```\n\n## Field Preprocessing and Related objects\n\nIf you want to process a field before indexing it (e.g. capitalizing a `Contact`'s `name`),\nor if you want to index a [related object](https://docs.djangoproject.com/en/1.11/ref/models/relations/)'s\nattribute, you need to define **proxy methods** for these fields.\n\n### Models\n\n```python\nclass Account(models.Model):\n    username = models.CharField(max_length=40)\n    service = models.CharField(max_length=40)\n\nclass Contact(models.Model):\n    name = models.CharField(max_length=40)\n    email = models.EmailField(max_length=60)\n    //...\n    accounts = models.ManyToManyField(Account)\n\n    def account_names(self):\n        return [str(account) for account in self.accounts.all()]\n\n    def account_ids(self):\n        return [account.id for account in self.accounts.all()]\n```\n\n### Index\n\n```python\nfrom algoliasearch_django import AlgoliaIndex\n\nclass ContactIndex(AlgoliaIndex):\n    fields = ('name', 'email', 'company', 'address', 'city', 'county',\n              'state', 'zip_code', 'phone', 'fax', 'web', 'followers', 'account_names', 'account_ids')\n\n    settings = {\n        'searchableAttributes': ['name', 'email', 'company', 'city', 'county', 'account_names',\n        }\n```\n\n- With this configuration, you can search for a `Contact` using its `Account` names\n- You can use the associated `account_ids` at search-time to fetch more data from your\nmodel (you should **only proxy the fields relevant for search** to keep your records' size\nas small as possible)\n\n## Index settings\n\nWe provide many ways to configure your index allowing you to tune your overall index relevancy.\nAll the configuration is explained on [our doc](https://www.algolia.com/doc/api-reference/api-parameters/).\n\n```python\nclass ArticleIndex(AlgoliaIndex):\n    settings = {\n        'searchableAttributes': ['name', 'description', 'url'],\n        'customRanking': ['desc(vote_count)', 'asc(name)']\n    }\n```\n\n## Restrict indexing to a subset of your data\n\nYou can add constraints controlling if a record must be indexed or not. `should_index` should be a\ncallable that returns a boolean.\n\n```python\nclass Contact(models.model):\n    name = models.CharField(max_length=20)\n    age = models.IntegerField()\n\n    def is_adult(self):\n        return (self.age >= 18)\n\nclass ContactIndex(AlgoliaIndex):\n    should_index = 'is_adult'\n```\n\n## Multiple indices per model\n\nIt is possible to have several indices for a single model.\n\n- First, define all your indices that you want for a model:\n\n```python\nfrom algoliasearch_django import AlgoliaIndex\n\nclass MyModelIndex1(AlgoliaIndex):\n    name = 'MyModelIndex1'\n    ...\n\nclass MyModelIndex2(AlgoliaIndex):\n    name = 'MyModelIndex2'\n    ...\n```\n\n- Then, define a meta model which will aggregate those indices:\n\n```python\nclass MyModelMetaIndex(AlgoliaIndex):\n    def __init__(self, model, client, settings):\n        self.indices = [\n            MyModelIndex1(model, client, settings),\n            MyModelIndex2(model, client, settings),\n        ]\n\n    def raw_search(self, query='', params=None):\n        res = {}\n        for index in self.indices:\n            res[index.name] = index.raw_search(query, params)\n        return res\n\n    def update_records(self, qs, batch_size=1000, **kwargs):\n        for index in self.indices:\n            index.update_records(qs, batch_size, **kwargs)\n\n    def reindex_all(self, batch_size=1000):\n        for index in self.indices:\n            index.reindex_all(batch_size)\n\n    def set_settings(self):\n        for index in self.indices:\n            index.set_settings()\n\n    def clear_index(self):\n        for index in self.indices:\n            index.clear_index()\n\n    def save_record(self, instance, update_fields=None, **kwargs):\n        for index in self.indices:\n            index.save_record(instance, update_fields, **kwargs)\n\n    def delete_record(self, instance):\n        for index in self.indices:\n            index.delete_record(instance)\n```\n\n- Finally, register this `AlgoliaIndex` with your `Model`:\n\n```python\nimport algoliasearch_django as algoliasearch\nalgoliasearch.register(MyModel, MyModelMetaIndex)\n```\n\n## Temporarily disable the auto-indexing\n\nIt is possible to temporarily disable the auto-indexing feature using the `disable_auto_indexing` context decorator:\n\n```python\nfrom algoliasearch_django.decorators import disable_auto_indexing\n\n# Used as a context manager\nwith disable_auto_indexing():\n    MyModel.save()\n\n# Used as a decorator\n@disable_auto_indexing():\nmy_method()\n\n# You can also specifiy for which model you want to disable the auto-indexing\nwith disable_auto_indexing(MyModel):\n    MyModel.save()\n    MyOtherModel.save()\n\n```\n\n\n\n# Tests\n\n\n\n## Run Tests\n\nTo run the tests, first find your Algolia application id and Admin API key (found on the Credentials page).\n\n```shell\nALGOLIA_APPLICATION_ID={APPLICATION_ID} ALGOLIA_API_KEY={ADMIN_API_KEY} tox\n```\n\n\nTo override settings for some tests, use the [settings method](https://docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.SimpleTestCase.settings):\n```python\nclass OverrideSettingsTestCase(TestCase):\n    def setUp(self):\n        with self.settings(ALGOLIA={\n            'APPLICATION_ID': 'foo',\n            'API_KEY': 'bar',\n            'AUTO_INDEXING': False\n        }):\n            algolia_engine.reset(settings.ALGOLIA)\n\n    def tearDown(self):\n        algolia_engine.reset(settings.ALGOLIA)\n\n    def test_foo():\n        # ...\n```\n\n\n\n# Troubleshooting\n\n# Use the Dockerfile\nIf you want to contribute to this project without installing all its dependencies, you can use our Docker image. Please check our [dedicated guide](DOCKER_README.md) to learn more.\n\n## Frequently asked questions\n\nEncountering an issue? Before reaching out to support, we recommend heading to our [FAQ](https://www.algolia.com/doc/framework-integration/django/faq/) where you will find answers for the most common issues and gotchas with the package.\n\n\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Algolia Search integration for Django",
    "version": "3.0.0",
    "split_keywords": [
        "algolia",
        "pyalgolia",
        "search",
        "backend",
        "hosted",
        "cloud",
        "full-text search",
        "faceted search",
        "django"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "051153a8c84c18a9967f58ffe98ba0cbef879b75e851597ed868d1c7af25f7cb",
                "md5": "52ec74b59d0795bde077c4f125d28e07",
                "sha256": "500775887261b93e1fe3813983678d04b499d5d043c0f538009ca4a9a84585ef"
            },
            "downloads": -1,
            "filename": "algoliasearch_django-3.0.0-py2.py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "52ec74b59d0795bde077c4f125d28e07",
            "packagetype": "bdist_wheel",
            "python_version": "py2.py3",
            "requires_python": null,
            "size": 18811,
            "upload_time": "2023-04-28T07:09:59",
            "upload_time_iso_8601": "2023-04-28T07:09:59.385575Z",
            "url": "https://files.pythonhosted.org/packages/05/11/53a8c84c18a9967f58ffe98ba0cbef879b75e851597ed868d1c7af25f7cb/algoliasearch_django-3.0.0-py2.py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f42dafab04cee45ab9cb52be683d7a99cd424b9b87facf6f9eed53522b34ace3",
                "md5": "a1ac482446d8c63fd07713cf97a8906a",
                "sha256": "b6ce1ae8c899503e8a4745fb8fd5b0b9babc79cc706f3bfa6ca8eeefc8d7f568"
            },
            "downloads": -1,
            "filename": "algoliasearch-django-3.0.0.tar.gz",
            "has_sig": false,
            "md5_digest": "a1ac482446d8c63fd07713cf97a8906a",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 26686,
            "upload_time": "2023-04-28T07:10:02",
            "upload_time_iso_8601": "2023-04-28T07:10:02.158974Z",
            "url": "https://files.pythonhosted.org/packages/f4/2d/afab04cee45ab9cb52be683d7a99cd424b9b87facf6f9eed53522b34ace3/algoliasearch-django-3.0.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-04-28 07:10:02",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "algolia",
    "github_project": "algoliasearch-django",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "django",
            "specs": [
                [
                    ">=",
                    "1.7"
                ]
            ]
        },
        {
            "name": "algoliasearch",
            "specs": [
                [
                    "<",
                    "4.0"
                ],
                [
                    ">=",
                    "3.0"
                ]
            ]
        },
        {
            "name": "pypandoc",
            "specs": []
        },
        {
            "name": "wheel",
            "specs": []
        },
        {
            "name": "tox",
            "specs": []
        },
        {
            "name": "twine",
            "specs": []
        },
        {
            "name": "factory_boy",
            "specs": []
        },
        {
            "name": "mock",
            "specs": []
        }
    ],
    "tox": true,
    "lcname": "algoliasearch-django"
}
        
Elapsed time: 1.03929s