我对搜索实现还很陌生,在学习的时候请耐心等待!
所以我的宠物项目是一个食谱网站,每个食谱可以有N个步骤。模型看起来像:

class Recipe(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField()
    hotness = models.ForeignKey(Hotness)
    recipe_diet = models.ManyToManyField(DietType)
    ingredients = models.ManyToManyField(Ingredient, through="RecipeIngredient")

class DietType(models.Model):
    diet_type = models.CharField(max_length=50)
    description = models.TextField(null=True, blank=True)

class RecipeIngredient(models.Model):
    recipe = models.ForeignKey(Recipe)
    ingredient = models.ForeignKey(Ingredient)
    quantifier = models.ForeignKey(Quantifier)
    quantity = models.FloatField()

class RecipeSteps(models.Model):
    step_number = models.IntegerField()
    description = models.TextField()
    recipe = models.ForeignKey(Recipe)

(简写)
我想索引所有的:食谱,食谱,食谱,饮食类型和步骤…
饮食类型和食谱似乎工作得很好,但步骤却不是。我想这与“relatedsearchqueryset”的用法有关?
这是我的搜索结果。
from haystack import indexes
from recipes.models import Recipe

class RecipeIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr='title')
    ingredients = indexes.MultiValueField(indexed=True, stored=True)
    description = indexes.CharField(model_attr='description')
    hotness = indexes.CharField(model_attr='hotness')
    diet_type = indexes.MultiValueField(indexed=True, stored=True)
    recipesteps = indexes.MultiValueField(indexed=True, stored=True)

    def prepare_steps(self, object):
        return [step.description for step in object.recipesteps.all()]

    def get_model(self):
        return Recipe

    def load_all_queryset(self):
        # Pull all objects related to the Note in search results.
        return Recipe.objects.all().select_related()

以下是模板配方_text.txt:
{{ object.title }}
{{ object.cuisine }}
{% for ingr in object.ingredients.all %}
  {{ ingr.title }}
{% endfor %}
{{ object.description }}
{% for dt in object.recipe_diet.all %}
  {{ dt.diet_type }}
{% endfor %}
{{ object.user }}
{{ object.hotness }}
{% for step in object.recipesteps.all %}
  {{ step.description }}
{% endfor %}
{{ object.body }}

我可以搜索食材,标题,描述,饮食类型-所有的东西都有效,除了食谱。
最后,我只在此时通过shell进行查询:
#producing results:
sq = SearchQuerySet().filter(content='onion') #ingredient
sq = SearchQuerySet().filter(content='bolognese') #title
sq = SearchQuerySet().filter(content='bologna') #description
#not producing any results:
sq = SearchQuerySet().filter(content='chop') #step
sq = RelatedSearchQuerySet().filter(content='chop').load_all() #assuming this does the expanded search

知道吗?

最佳答案

我发现了两个问题:
prepare_steps中的名称RecipeIndex是错误的,应该是prepare_{field_name}所以将其更改为prepare_recipesteps
您试图以错误的方式访问相关步骤object.recipesteps.allobjectsrecipe_text.txt或者继续使用object.recipesteps_set.all但将其作为recipesteps配方的related_name添加到RecipeSteps模型中,例如

class RecipeSteps(models.Model):
    # //
    recipe = models.ForeignKey(Recipe, related_name='recipesteps')

08-07 20:29