在 Django-Haystack 2.X 版本中,SearchSite 和 haystack.site 已被移除,handle_registrations 和 autodiscover 也已被移除,同时引入了多索引支持、SignalProcessors 并移除了 RealTimeSearchIndex。此外,一些设置也被移除或重命名。
解决方案
1. 迁移 SearchSite
- 首先,需要在 settings.py 中添加以下代码:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
},
}
- 然后,需要在 models.py 中添加以下代码:
from haystack import indexes
class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return MyModel
- 接下来,需要在 urls.py 中添加以下代码:
from haystack.utils import loading
loading.register(MyModel, MyModelIndex)
2. 迁移 autodiscover
- 在 settings.py 中添加以下代码:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
},
}
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
- 然后,需要在 urls.py 中添加以下代码:
from haystack.utils import loading
loading.register(MyModel, MyModelIndex)
3. 迁移 RealTimeSearchIndex
RealTimeSearchIndex 已在 Django-Haystack 2.X 中移除,因此需要使用 SignalProcessors 来实现实时索引。
- 在 settings.py 中添加以下代码:
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
- 然后,需要在 models.py 中添加以下代码:
from haystack import indexes
class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return MyModel
def save_object(self, instance):
super(MyModelIndex, self).save_object(instance)
self.update_object(instance, commit=False)
def delete_object(self, instance):
super(MyModelIndex, self).delete_object(instance)
4. 迁移各种设置
一些设置在 Django-Haystack 2.X 中被移除或重命名,需要根据实际情况进行迁移。
以下是常见的迁移设置:
旧设置 | 新设置 | 默认值 |
---|---|---|
HAYSTACK_SITECONF | HAYSTACK_CONNECTIONS | {} |
HAYSTACK_SEARCH_RESULTS_PER_PAGE | HAYSTACK_DEFAULT_SEARCH_RESULTS_PER_PAGE | 10 |
HAYSTACK_ID_FIELD | HAYSTACK_DEFAULT_ID_FIELD | ‘id’ |
HAYSTACK_DATETIME_FORMAT | HAYSTACK_DEFAULT_DATETIME_FORMAT | ‘%Y-%m-%dT%H:%M:%S.%fZ’ |
HAYSTACK_DEFAULT_OPERATOR | HAYSTACK_DEFAULT_OPERATOR | ‘OR’ |
HAYSTACK_ANALYZER | HAYSTACK_DEFAULT_ANALYZER | ‘whoosh.analysis.StandardAnalyzer’ |
HAYSTACK_STOP_WORDS | HAYSTACK_DEFAULT_STOP_WORDS | set() |
HAYSTACK_STEMMER | HAYSTACK_DEFAULT_STEMMER | ‘whoosh.stemmers.PorterStemmer’ |
HAYSTACK_PREPROCESSORS | HAYSTACK_DEFAULT_PREPROCESSORS | [] |
HAYSTACK_POSTPROCESSORS | HAYSTACK_DEFAULT_POSTPROCESSORS | [] |
HAYSTACK_INCLUDE_SPELLING | HAYSTACK_DEFAULT_INCLUDE_SPELLING | False |
HAYSTACK_LANGUAGE_DETECTION | HAYSTACK_DEFAULT_LANGUAGE_DETECTION | True |
HAYSTACK_SEARCH_FAR_AWAY | HAYSTACK_DEFAULT_SEARCH_FAR_AWAY | False |
HAYSTACK_MORPHOLOGY | HAYSTACK_DEFAULT_MORPHOLOGY | None |
HAYSTACK_DEFAULT_WILDCARD | HAYSTACK_DEFAULT_DEFAULT_WILDCARD | ‘*’ |
HAYSTACK_FUZZY_WIGHT | HAYSTACK_DEFAULT_FUZZY_WEIGHT | 1.0 |
HAYSTACK_DEFAULT_BOOST | HAYSTACK_DEFAULT_DEFAULT_BOOST | 1.0 |
HAYSTACK_OR_BOOST | HAYSTACK_DEFAULT_OR_BOOST | 1.0 |
HAYSTACK_AND_BOOST | HAYSTACK_DEFAULT_AND_BOOST | 1.0 |
HAYSTACK_PHRASE_BOOST | HAYSTACK_DEFAULT_PHRASE_BOOST | 1.0 |
HAYSTACK_SLOP | HAYSTACK_DEFAULT_SLOP | 0 |
HAYSTACK_DISTANCE_MEASURE | HAYSTACK_DEFAULT_DISTANCE_MEASURE | ‘whoosh.scoring.BM25F’ |