Django Haystack:将 prepared_field_name 中的数据添加到索引模板
Django Haystack : Add data from prepared_field_name to the Indexing template
我正在使用模板创建将被索引的文档,我的模板看起来像:
{{object.generic_data}}
现在,我希望我的 generic_data 由 prepare_generic_data 函数生成。这样做似乎行不通,因为数据在准备函数可以 return 之前被馈送到模板。
所以,我想知道是否有一些方法可以让我在准备函数旁边使用模板或其他方法来解决这个问题。
此外,如果问题不够清楚,请告诉我。
编辑:
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)
在索引模板的上下文中,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 }}
我正在使用模板创建将被索引的文档,我的模板看起来像:
{{object.generic_data}}
现在,我希望我的 generic_data 由 prepare_generic_data 函数生成。这样做似乎行不通,因为数据在准备函数可以 return 之前被馈送到模板。
所以,我想知道是否有一些方法可以让我在准备函数旁边使用模板或其他方法来解决这个问题。
此外,如果问题不够清楚,请告诉我。 编辑:
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)
在索引模板的上下文中,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 }}