搜索同一模型中的一个属性或另一个属性

时间:2014-07-31 09:36:17

标签: django django-haystack

我正在尝试使用Haystack,并希望设置一个搜索引擎:

在同一模型中,我希望能够在attribute a中搜索attribute b 进行搜索。

我的模型结构如下:

Datas : a
        b
        date

我在search_indexes.py中尝试了以下代码:

class ADatasIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    a = indexes.CharField(model_attr='a')
    date = indexes.DateTimeField(model_attr='date')

    def get_model(self):
        return Datas

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(date__lte=datetime.datetime.now())

class BDatasIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    b = indexes.CharField(model_attr='b')
    date = indexes.DateTimeField(model_attr='date')


    def get_model(self):
        return Datas

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(date__lte=datetime.datetime.now())

但没有任何成功:

ImproperlyConfigured("Model '%s' has more than one 'SearchIndex`` hand
ling it. Please exclude either '%s' or '%s' using the 'HAYSTACK_EXCLUDED_INDEXES
' setting." % (model, self.indexes[model], index))
django.core.exceptions.ImproperlyConfigured: Model '<class 'mainsite.models.Datas'>' has more than one 'SearchIndex`` handling it. Please exclude either '<ma
insite.search_indexes.ADatasIndex object at 0x03176DF8>' or '<mains
ite.search_indexes.BDatasIndex object at 0x031AD8F0>' using the 'HAYSTACK
_EXCLUDED_INDEXES' setting.

2 个答案:

答案 0 :(得分:0)

您获得的错误来自同一模型的两个SearchIndex类。

您只需要一个 SearchIndex,然后两个字段都会被放在数据模板上。

class DatasIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    a = indexes.CharField(model_attr='a')
    b = indexes.CharField(model_attr='b')
    date = indexes.DateTimeField(model_attr='date')

    def get_model(self):
        return Datas

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(date__lte=datetime.datetime.now())

然后,在模板目录中,创建一个文件:

搜索/索引/ MyApp的/ datas_text.txt

在该文件中:

{{ object.a }}
{{ object.b }}

以及您要搜索的任何其他字段。

干草堆文档是here

答案 1 :(得分:0)

您可以使用此haystack issue中提到的代理模型。

class BDatas(Datas):
    class Meta:
        proxy = True

然后在BDatasIndex

def get_model(self):
    return BDatas