Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

haystack - how you display data from multiple models with ForeignKeys?

I have two models:

models.py

class model1 (models.Model):
   field1_model1 = models.CharField()
   filed2_model1 = models.CharField()

class model2 (models.Model):
   field1_model2 = models.ForeignKey(model1)
   field2_model2 = models.CharField()

Using Haystack I want to do a text search based on the filed1_model1 but when I do that I want to show also filed2_model2 in the search results.

What goes in the search_indexes.py and also in the search.html template files to make this happen?

like image 476
avatar Avatar asked Jul 24 '11 03:07

avatar


1 Answers

First you should add a related name to your foreign key so you can call it later.

class Model2(models.Model):
   field1_model2 = models.ForeignKey(Model1, related_name='something')
   field2_model2 = models.CharField()

Then index Model1. For field2_model2, prepare the data by getting the info as seen below.

class Model1Index(indexes.SearchIndex):
    text = indexes.CharField(document=True, use_template=True)
    field1_model1 = indexes.CharField(model_attr='field1_model1', faceted=True)
    field2_model2 = indexes.Charfield()

    def prepare_field2_model2(self, obj):
        return obj.something.field2_model2

site.register(Model1, Model1Index)

In your search.html you would display the data with {{ result.field1_model1 }} and {{ result.field2_model2 }}

Don't forget to add the fields to your .txt file, probably called model1_text.txt in templates -> search -> indexes -> app_name. (or something similar)

{{ object.field1_model1 }}
{{ object.field2_model2 }}

And then it should just be a matter of updating the schema and rebuilding your index and you should be good to go.

like image 183
TomHarrigan Avatar answered Sep 24 '22 06:09

TomHarrigan