Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 主字段名(document=True)_Python_Django_Django Haystack - Fatal编程技术网

Python 主字段名(document=True)

Python 主字段名(document=True),python,django,django-haystack,Python,Django,Django Haystack,Django Haystack: 但我不明白它的意思。这是他们的示例模型: 导入日期时间 从haystack导入索引 从myapp.models导入说明 class NoteIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) author = indexes.CharField(model_attr='user')

Django Haystack:

但我不明白它的意思。这是他们的示例模型:

导入日期时间 从haystack导入索引 从myapp.models导入说明

class NoteIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    author = indexes.CharField(model_attr='user')
    pub_date = indexes.DateTimeField(model_attr='pub_date')

    def get_model(self):
        return Note

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now())
我引用的文本是指我的模型主字段,并说我应该称它为“text”,还是指search_index.py中定义的类

如果指向search_indexes.py中的类,则在上面的示例中,它附加到的字段名在哪里?它没有型号属性

text = indexes.CharField(document=True, use_template=True)
如果说到我的实际应用程序模型,我将如何重构一个包含许多应用程序的项目,并将其主文本字段称为“text”


请告知。谢谢。

您的
搜索索引定义不需要反映您的模型定义,它需要将不同模型的数据映射到通用搜索文档。

  • 为什么文本字段需要统一命名
  • 地图内容是如何来源的?(为什么没有
    model\u attr
    关键字)
  • Haystack文档建议您的
    SearchIndex
    字段应在
    SearchIndex
    定义中统一命名,而不是模型字段需要统一命名。搜索索引定义和模型定义之间有一个主要区别。您不需要也不应该担心模型字段和搜索字段之间的1-1映射

    从你的模型中退一步,首先考虑你想要搜索什么。您是否会通过通用搜索视图搜索多个不同的模型?假设您有两种型号:

    class Note(models.Model):
        title = models.CharField(max_length=40)
        body = models.TextField()
    
    class Memo(models.Model):
        subject = models.CharField(max_length=50)
        content = models.TextField()
        author = models.ForeignKey(StaffMember)
    
    我们希望创建一个简单的搜索视图,只搜索模型的主要内容以及内容对象的标题或名称(名称、标题、主题等)

    这里有一个坏例子(不要这样做):

    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        body = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        content = indexes.CharField(document=True, use_template=True)
        subject = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    在这个糟糕的示例中,每个搜索索引都定义了一个主要内容字段和一个内容名称字段(标题或主题)。但是你现在怎么搜索呢?如果您根据
    主题
    对内容进行查询,您将错过
    注释
    内容,同样,如果您根据
    正文
    进行查询,您也会错过内容

    更好的例子(这样做):

    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        body = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        content = indexes.CharField(document=True, use_template=True)
        subject = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    请注意,字段名不一定与模型字段名匹配。您只需定义
    SearchIndex
    字段应该从哪个模型属性获取数据

    您在搜索引擎中搜索文档,而不是数据库中的行,因此
    SeachIndex
    定义将数据库(一个表或多个查询)中的内容映射到搜索文档。
    SearchIndex
    定义是一种转换,每个
    SearchField
    根据您的指定转换数据


    至于您关于缺少的
    型号属性的问题,这只是获取内容的一种方法。您还可以从模板中呈现文本内容,这是上面的
    text
    字段所做的(请参见该模板上的)。
    model\u attr
    源代码适用于简单的字符字段。

    您的
    SearchIndex
    定义不需要反映您的模型定义,它需要将不同模型的数据映射到通用搜索文档。

  • 为什么文本字段需要统一命名
  • 地图内容是如何来源的?(为什么没有
    model\u attr
    关键字)
  • Haystack文档建议您的
    SearchIndex
    字段应在
    SearchIndex
    定义中统一命名,而不是模型字段需要统一命名。搜索索引定义和模型定义之间有一个主要区别。您不需要也不应该担心模型字段和搜索字段之间的1-1映射

    从你的模型中退一步,首先考虑你想要搜索什么。您是否会通过通用搜索视图搜索多个不同的模型?假设您有两种型号:

    class Note(models.Model):
        title = models.CharField(max_length=40)
        body = models.TextField()
    
    class Memo(models.Model):
        subject = models.CharField(max_length=50)
        content = models.TextField()
        author = models.ForeignKey(StaffMember)
    
    我们希望创建一个简单的搜索视图,只搜索模型的主要内容以及内容对象的标题或名称(名称、标题、主题等)

    这里有一个坏例子(不要这样做):

    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        body = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        content = indexes.CharField(document=True, use_template=True)
        subject = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    在这个糟糕的示例中,每个搜索索引都定义了一个主要内容字段和一个内容名称字段(标题或主题)。但是你现在怎么搜索呢?如果您根据
    主题
    对内容进行查询,您将错过
    注释
    内容,同样,如果您根据
    正文
    进行查询,您也会错过内容

    更好的例子(这样做):

    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        body = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        content = indexes.CharField(document=True, use_template=True)
        subject = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    
    请注意,字段名不一定与模型字段名匹配。您只需定义
    SearchIndex
    字段应该从哪个模型属性获取数据

    您在搜索引擎中搜索文档,而不是数据库中的行,因此
    SeachIndex
    定义将数据库(一个表或多个查询)中的内容映射到搜索文档。
    SearchIndex
    定义是一种转换,每个
    SearchField
    根据您的指定转换数据

    至于您关于缺少的
    型号属性的问题,这只是获取内容的一种方法。您还可以从模板中呈现文本内容,这是上面的
    text
    字段所做的(请参见该模板上的)。
    model\u attr
    源代码适用于简单字符字段