如何使用Haystack / Whoosh与Django索引外键CharField?

时间:2013-11-19 20:41:13

标签: python django django-haystack

使用prepare_FOO(self, object)方法,我正在尝试索引ForeignKey以获取我的代码的name属性(旅行,家庭等......)

这是我的模特

class Blog(models.Model):
    title = models.CharField(max_length=500)
    description = models.TextField(blank=True, null=True)
    tag = models.ForeignKey(Tag)
    #...

在我的search_index.py中,这就是我所拥有的:

class BlogIndex(indexes.SearchIndex, indexes.Indexable):

    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    description = indexes.CharField(model_attr='description')

    tag_name = indexes.CharField()
    def get_model(self):
        return Blog

    def prepare_tag_name(self, obj):
        return obj.tag.name

    def index_queryset(self, using=None):
        return self.get_model().objects.all().select_related('blog__tag')

...还有我的blog_text:

{{ object.title }}
{{ object.description }}

任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:5)

您只需在blog_text文件blog_text中添加以下内容并重建索引。它的工作原理!

{{ object.title }}
{{ object.description }}
{{ object.tag.name }}

您在班级BlogIndex

中不需要这样做
tag_name = indexes.CharField()
def prepare_tag_name(self, obj):
    return obj.tag.name

类似的答案就在这里 Search over multiple fields 这里有一个很好的解释 haystack multiple field search 在索引中,您应该使用document=True定义一个字段,这是haystack将搜索的文档。按照惯例,此字段命名为文本。如果您打算对其值进行过滤或排序,则可以添加额外的字段。

基本上,您在Index类中包含的字段主要用于排序或过滤。 搜索字段在blog_text文件中定义。

这里的另一种解决方案更复杂。 haystack - how you display data from multiple models with ForeignKeys?

答案 1 :(得分:1)

这是一个非常古老的问题,但答案并没有真正解决问题(即使这是一个正确的答案) Pompeyo,我认为haystack需要(需要?)一个“model_attr”arg。你应该像这样定义你的tag_name:

tag_name = indexes.CharField(model_attr='tag')

你的prepare_foo方法:

def prepare_tag_name(self, obj):
    return '' if not obj.tag else obj.tag.name
相关问题