Django:使用Mongoengine的Haystack和Elasticsearch [英] Django: Haystack and Elasticsearch with Mongoengine
问题描述
我正在尝试将Haystack Elasticsearch与我的使用MongoDB作为数据库的Django REST应用程序集成.这是我的源代码:
models.py
class Books(Document):
ISBN = fields.StringField(null=False, required=True)
book_name = fields.StringField(null=False, required=True)
genre = fields.StringField(null=False, required=True)
author = fields.StringField(null=False, required=True)
publisher = fields.StringField(null=False,required=True)
price = fields.IntField(required=True)
stock = fields.IntField(required=True)
search_indexes.py
class BookIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
book = indexes.CharField(model_attr="book_name")
price = indexes.CharField(model_attr="price")
def get_model(self):
return Books
def index_queryset(self, using=None):
return self.get_model().objects.filter(
created__lte=timezone.now()
)
serializer.py
class BookIndexSerilizer(HaystackSerializer):
class Meta:
index_classes = [BookIndex]
fields = [
'text', 'book', 'price'
]
views.py
class BookSearchView(HaystackViewSet):
index_models = [Books]
serializer_class = BookIndexSerilizer
urls.py
router = routers.DefaultRouter()
router.register('search/', BookSearchView, 'Books')
settings.py
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'haystack',
},
}
当我点击搜索URL时,出现以下异常: AttributeError('要添加到查询中的模型必须从Model派生.'). 怎么了?
问题是Books
是从Document
派生的,它要求模型class Books(Document):
是从Model
派生的,例如class Books(models.Model):
. /p>
I am trying to integrate Haystack Elasticsearch with my django REST application that uses MongoDB as database. Here is my source code:
models.py
class Books(Document):
ISBN = fields.StringField(null=False, required=True)
book_name = fields.StringField(null=False, required=True)
genre = fields.StringField(null=False, required=True)
author = fields.StringField(null=False, required=True)
publisher = fields.StringField(null=False,required=True)
price = fields.IntField(required=True)
stock = fields.IntField(required=True)
search_indexes.py
class BookIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
book = indexes.CharField(model_attr="book_name")
price = indexes.CharField(model_attr="price")
def get_model(self):
return Books
def index_queryset(self, using=None):
return self.get_model().objects.filter(
created__lte=timezone.now()
)
serializer.py
class BookIndexSerilizer(HaystackSerializer):
class Meta:
index_classes = [BookIndex]
fields = [
'text', 'book', 'price'
]
views.py
class BookSearchView(HaystackViewSet):
index_models = [Books]
serializer_class = BookIndexSerilizer
urls.py
router = routers.DefaultRouter()
router.register('search/', BookSearchView, 'Books')
settings.py
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'haystack',
},
}
When i hit the search URL i get following exception: AttributeError('The model being added to the query must derive from Model.'). What is going wrong?
the problem is that Books
is deriving from Document
, it is requiring the model class Books(Document):
derives from Model
like class Books(models.Model):
.
这篇关于Django:使用Mongoengine的Haystack和Elasticsearch的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!