Django:使用Mongoengine的Haystack和Elasticsearch [英] Django: Haystack and Elasticsearch with Mongoengine

查看:115
本文介绍了Django:使用Mongoengine的Haystack和Elasticsearch的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆