Django Haystack:将prepared_field_name中的数据添加到索引模板中

时间:2016-08-10 06:19:43

标签: django django-haystack

我正在使用模板来创建将被编入索引的文档,我的模板看起来像是:

{{object.generic_data}}

现在,我希望我的generic_data由prepare_generic_data函数生成。这样做似乎无法正常工作,因为在准备功能可以返回之前,数据正被送到模板。

所以,我想知道是否有一些方法让我在准备功能旁边使用模板或另一种方法来解决这个问题。

另外,如果问题不够明确,请告诉我。 编辑:

Search_index

import datetime
from haystack import indexes
from diskus.models import Recipe,Post


class PostIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(document=True, use_template=True)
    post_id=indexes.IntegerField(model_attr='user_entity_id_id')
    content_key=indexes.IntegerField(model_attr='content_key')
    content_type=indexes.IntegerField(model_attr='content_type')
    generic_data=indexes.CharField()
    slug=indexes.CharField(model_attr='slug')

    def get_model(self):
        return Post

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

    def prepare_generic_data(self,obj):
        if obj.content_type==3:
            recipe=Recipe.objects.get(pk=obj.content_key)
            return recipe.name
        else:
            return "random_stuff"

型号:

class Post(UserEntity):
    user_entity_id = models.OneToOneField(UserEntity,
                              on_delete=models.CASCADE,
                              related_name='post',
                              primary_key=True,
                              db_column='id')
    content_key = models.IntegerField()
    content_type = models.IntegerField()

class Recipe(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)

1 个答案:

答案 0 :(得分:0)

在索引模板的上下文中,object模型实例(一个Post对象),而不是PostIndex对象。因此object没有generic_data属性。您无法从模板内部访问其他索引字段。

最简单的解决方案是将generic_data的逻辑移到Post模型中,如下所示:

class Post(UserEntity):

    def generic_data(self):
        if self.content_type == 3:
            # NOTE: you may need to ensure the Recipe is defined 
            # before Post in the models.py file, or you will get a name
            # resolution error.
            recipe = Recipe.objects.get(pk=self.content_key)
            return recipe.name
        else:
            return "random_stuff"

然后模板中的现有代码将起作用:

{{ object.generic_data }}