2017-06-26 7 views
9

Ich bin ziemlich neu zu suchen Implementierung, mit mir zu tragen, während ich lerne!Indexieren und suchen verwandte Objekte mit Heuhaufen

Also mein Haustier-Projekt ist eine Rezept-Website und jedes Rezept kann n Schritte haben. Das Modell sieht ungefähr so ​​aus:

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) 

(der Kürze halber abgekürzt)

ich alles zu indizieren möchten: Rezept, recipeIngredient, DietType und Schritte ... Die DietType und recipeIngredient scheinen gut zu funktionieren , aber die Schritte sind nicht. Ich nehme an, dies hat mit der Verwendung von 'RelatedSearchQuerySet' zu tun?

Hier ist meine search_indexes.py:

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() 

Hier ist die Vorlage recipe_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 }} 

Ich kann Zutaten, Titel, Beschreibung, Diät-Typ suchen - alles funktioniert, außer der Rezeptschritte.

Schließlich mache ich Abfragen durch die Schale nur im Moment:

#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 

Jede Idee?

+0

Ich möchte in der Lage sein, Rezepte zu erhalten, die einen Schritt enthalten, die eine Suchabfrage übereinstimmt. IE: Ich möchte die Schritte selbst suchen, aber das Rezept zurückbekommen. – dengar81

+0

Hat 'RecipeSteps' einen eigenen Index? –

+0

Nein, ich habe dies noch nicht für die Suche indiziert. Ist das der Schlüssel? – dengar81

Antwort

5

Ich habe identifiziert zwei Probleme:

  1. Der Name prepare_steps in Ihrem RecipeIndex falsch ist, sollte es sein prepare_{field_name} so es prepare_recipesteps

  2. ändern Sie versuchen, ähnliche Schritte für den Zugriff auf object.recipesteps.allrecipe_text.txt Objekte in ein falscher Weg, sollte es object.recipesteps_set.all sein. Oder behalte weiter recipesteps, aber füge dies als related_name in RecipeSteps Modell für ForeignKey Rezept, z.

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