2011-07-24 10 views
7

que tienen dos modelos:haystack: ¿cómo muestra los datos de varios modelos con ForeignKeys?

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

Uso de Haystack quiero hacer una búsqueda de texto basado en la filed1_model1 pero cuando hago lo que quiero mostrar también filed2_model2 en los resultados de búsqueda.

¿Qué se incluye en search_indexes.py y también en los archivos de plantilla search.html para que esto suceda?

Respuesta

6

Primero debe agregar un nombre relacionado a su clave externa para que pueda llamarla más tarde.

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

Luego indexe Model1. Para field2_model2, prepare los datos obteniendo la información como se ve a continuación.

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) 

En su search.html que le mostrará los datos con {{ result.field1_model1 }} y {{ result.field2_model2 }}

No se olvide de agregar los campos a su archivo .txt, probablemente llamado model1_text.txt en las plantillas -> buscar - > índices -> nombre_aplicación. (O algo similar)

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

Y entonces debe ser sólo una cuestión de la actualización del esquema y la reconstrucción de su índice y usted debe ser bueno para ir.

+1

Esto me puso en el camino correcto. Creo que el nombre del método debe ser prepare_field2_model2 en lugar de prepare_name. Aquí están los documentos de pajar relacionados: http://docs.haystacksearch.org/dev/searchindex_api.html#prepare-foo-self-object – Jeff

+0

Suena bien. Me alegro de que haya ayudado. Actualizaré la respuesta con su corrección. – TomHarrigan

Cuestiones relacionadas