<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"
}