我想将第二个模型中的字段添加到django-haystack查询中。我有两个具有以下结构的模型:
class Product(models.Model):
created_date = models.DateField(auto_now_add=True)
name = models.CharField(max_length=254)
summary = models.CharField(null=True, blank=True, max_length=255)
....
class Color(models.Model):
product_color = models.CharField(max_length=256, blank=True, null=True)
created_date = models.DateField(auto_now_add=True)
slug = models.SlugField(max_length=254)
product = models.ForeignKey('Product')
我有以下search_index.py:
from django.utils import timezone
from haystack import indexes
from .models import Product
from .models import Color
class ProductIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Product
def index_queryset(self, using=None):
"""Used when the entire index for model is updated."""
return self.get_model().objects.filter(
created_date__lte=timezone.now())
如何将Color
模型product_color
添加到搜索索引中,以便如果有人在搜索查询中包含product_color
的部分内容,则会返回与颜色有ForeignKey关系的Product
?
答案 0 :(得分:2)
使用MultiValueField
来存储与产品相关的所有颜色:
product_colors = indexes.MultiValueField()
准备它:
def prepare_product_colors(self, obj):
return [o.product_color for o in obj.color_set.all()]
直接使用该字段按产品颜色进行过滤。或者,如果您不想在特定字段上使用搜索而是执行自动查询,则将产品颜色附加到最终索引文本:
def prepare(self, obj):
prepared_data = super(SlateUpIndex, self).prepare(obj)
prepared_data['text'] += ' '.join(self.prepare_product_colors(obj))
return prepared_data
而不是执行上述所有操作,只需在模板search/indexes/{app_label}/{model_name}_{field_name}.txt
中添加颜色:
{% for color in object.color_set.all %}
{{ color.product_color }}
{% endfor %}
答案 1 :(得分:0)
产品有多种颜色吗?如果没有,我会从“产品”模型中选择“颜色”。
按原样,您可以向索引添加一个MultiValue字段,并使用'prepare_foo'函数准备值,该函数是django表单中的内置帮助程序a-la'clead_foo'。
有关详细信息,请参阅文档:SearchIndex Api
例如:
colors = indexes.MultValueField()
def prepare_colors(self, obj):
return [color.product_color for color in obj.color_set.all()]