2017-06-26 39 views
9

Uygulamayı aramak için oldukça yeni oldum, öğrenirken benimle birlikte ol!Endişe ve haystack ile ilgili nesneleri arama

Bu yüzden evcil hayvan projem bir yemek sitesidir ve her tarifin n adımı olabilir.

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) 

(kısalık için kısaltılmış)

Her şeyi endeksi istiyorum

: Reçete, recipeIngredient, DietType ve Adımlar ... DietType ve recipeIngredient iyi çalışıyor gibi görünüyor modeli gibi görünür ama Adımlar değil. Bunun 'RelatedSearchQuerySet' kullanımı ile ilgili olduğunu mu sanıyorum? Her şey hariç işleri -

{{ 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 }} 

Ben malzemeyi, başlık, açıklama, diyet türü arayabilir: Burada

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

şablon recipe_text.txt: İşte

benim search_indexes.py olduğunu RecipeSteps.

Son olarak, şu an sadece kabuk yoluyla sorguları yapıyorum:

#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 

fikrin var mı?

+0

Bir arama sorgusuna oldukça adımı ihtiva tarifleri elde edebilmek istiyorum. IE: Adımları kendim aramak istiyorum ama tarifi geri almak istiyorum. – dengar81

+0

'RecipeSteps''in kendi dizini var mı? –

+0

Hayır, henüz arama için henüz dizine eklemedim. Bu anahtar mı? – dengar81

cevap

5

İki sorunları belirledik: RecipeIndex yılında

  1. adı prepare_steps yanlış o prepare_{field_name} böylece de recipe_text.txt nesneleri object.recipesteps.all ilgili adımları ulaşmaya çalışıyorsunuz prepare_recipesteps

  2. olarak değiştirin olmalıdır Yanlış bir şekilde object.recipesteps_set.all olmalıdır. Veya recipesteps'u kullanmaya devam edin, ancakmodelindeki related_name modelini için ekleyin.

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