<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 3.8+**.
- Supports **Django 4.x** and **5.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_objects(self):
for index in self.indices:
index.clear_objects()
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": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"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/f1/b6/30682918e1d7a82b4b5d1c1c257b80edf4165f7b49c01c2f7d63a10968c0/algoliasearch_django-4.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<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\n1. **[Setup](#setup)**\n\n - [Introduction](#introduction)\n - [Install](#install)\n - [Setup](#setup)\n - [Quick Start](#quick-start)\n\n1. **[Commands](#commands)**\n\n - [Commands](#commands)\n\n1. **[Search](#search)**\n\n - [Search](#search)\n\n1. **[Geo-Search](#geo-search)**\n\n - [Geo-Search](#geo-search)\n\n1. **[Tags](#tags)**\n\n - [Tags](#tags)\n\n1. **[Options](#options)**\n\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\n - [Run Tests](#run-tests)\n\n1. **[Troubleshooting](#troubleshooting)**\n - [Frequently asked questions](#frequently-asked-questions)\n\n# Setup\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 3.8+**.\n- Supports **Django 4.x** and **5.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# Commands\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# Search\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# Geo-Search\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# Tags\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# Options\n\n## Custom `objectID`\n\nYou can choose which field will be used as the `objectID `. The field should be unique and can\nbe 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\n model (you should **only proxy the fields relevant for search** to keep your records' size\n as 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_objects(self):\n for index in self.indices:\n index.clear_objects()\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# Tests\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\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\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# Troubleshooting\n\n# Use the Dockerfile\n\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",
"bugtrack_url": null,
"license": "MIT License",
"summary": "Algolia Search integration for Django",
"version": "4.0.0",
"project_urls": {
"Homepage": "https://github.com/algolia/algoliasearch-django"
},
"split_keywords": [
"algolia",
" pyalgolia",
" search",
" backend",
" hosted",
" cloud",
" full-text search",
" faceted search",
" django"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3d7df6caf0d2ed954f6db40a1179be8cd7a5d03611aa6d6fb6056e1889714599",
"md5": "c218935ae49d06fc184563e7625366b8",
"sha256": "d160b86cd999607e9b3b0773a712e196e251af2b7dcb2480e40ef09440f3c80a"
},
"downloads": -1,
"filename": "algoliasearch_django-4.0.0-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "c218935ae49d06fc184563e7625366b8",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 18685,
"upload_time": "2025-01-06T08:56:57",
"upload_time_iso_8601": "2025-01-06T08:56:57.255483Z",
"url": "https://files.pythonhosted.org/packages/3d/7d/f6caf0d2ed954f6db40a1179be8cd7a5d03611aa6d6fb6056e1889714599/algoliasearch_django-4.0.0-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f1b630682918e1d7a82b4b5d1c1c257b80edf4165f7b49c01c2f7d63a10968c0",
"md5": "acf4dc73373126f1a84f10274905110e",
"sha256": "c0acb8231163c16757d9e4c37a0ce882b89c4640a6dc836daaf479fd73c427b5"
},
"downloads": -1,
"filename": "algoliasearch_django-4.0.0.tar.gz",
"has_sig": false,
"md5_digest": "acf4dc73373126f1a84f10274905110e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26688,
"upload_time": "2025-01-06T08:56:59",
"upload_time_iso_8601": "2025-01-06T08:56:59.916668Z",
"url": "https://files.pythonhosted.org/packages/f1/b6/30682918e1d7a82b4b5d1c1c257b80edf4165f7b49c01c2f7d63a10968c0/algoliasearch_django-4.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-06 08:56:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "algolia",
"github_project": "algoliasearch-django",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "Django",
"specs": [
[
">=",
"4.0"
]
]
},
{
"name": "algoliasearch",
"specs": [
[
"<",
"5.0"
],
[
">=",
"4.0"
]
]
},
{
"name": "factory_boy",
"specs": [
[
">=",
"3.0"
],
[
"<",
"4.0"
]
]
},
{
"name": "mock",
"specs": [
[
"<",
"6.0"
],
[
">=",
"5.0"
]
]
},
{
"name": "pypandoc",
"specs": [
[
">=",
"1.0"
],
[
"<",
"2.0"
]
]
},
{
"name": "pyright",
"specs": [
[
"<",
"2.0"
],
[
">=",
"1.1.389"
]
]
},
{
"name": "ruff",
"specs": [
[
">=",
"0.7.4"
],
[
"<",
"1.0"
]
]
},
{
"name": "setuptools",
"specs": [
[
"<",
"76.0"
],
[
">=",
"75.0"
]
]
},
{
"name": "six",
"specs": [
[
">=",
"1.16"
],
[
"<",
"2.0"
]
]
},
{
"name": "tox",
"specs": []
},
{
"name": "twine",
"specs": []
},
{
"name": "wheel",
"specs": []
}
],
"tox": true,
"lcname": "algoliasearch-django"
}