2013-05-31 6 views
5

ho i seguenti modelli:ottenere l'oggetto chiave esterna nella SearchQuerySet risultati Haystack

class EquipmentModel(models.Model): 
    name = models.CharField(max_length=64, blank=False) 
    description = models.CharField(max_length=64, blank=True) 
    manufacturer = models.ForeignKey(Manufacturer, related_name="manufacturer") 
    .... 

ei seguenti indici:

class EquipmentModelIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    name = indexes.CharField(model_attr="name") 
    manufacturer = indexes.CharField() 

    def get_model(self): 
     return EquipmentModel 

    def index_queryset(self, using=None): 
     return self.get_model().objects.all() 

e che per il mio equipmentmodel_text.txt

{{oggetto .name}} {{object.manufacturer}}

Tuttavia, quando mai eseguire questa query:

results = SearchQuerySet().models(EquipmentModel).filter(name__startswith=request.GET['q'])[:5] 

Ho solo il pk del produttore. Voglio l'intero oggetto (o almeno il suo nome). È possibile?!

Grazie!

risposta

7

Per ottenere che si deve già add the manufacturer's name all'indice quando l'indicizzazione:

class EquipmentModelIndex(indexes.SearchIndex, indexes.Indexable): 
    # your other fields 
    manufacturer_name = indexes.CharField() 

    def index_queryset(self, using=None): 
     # using select_related here should avoid an extra query for getting 
     # the manufacturer when indexing 
     return self.get_model().objects.all().select_related('manufacturer') 

    def prepare_manufacturer_name(self, obj): 
     return obj.manufacturer.name 
+0

Va bene funziona! Ora ... Sono un po 'confuso su quale sia la differenza tra i campi in EquipmentModelIndex e quelli nel equipmentmodel_text.txt ...? Nel file .txt dovrei inserire {{object.manufacturer.name}} o {{object.manufacturer_name}}? Come mai anche se rimuovo completo manufacturer_name dagli Indexes e dal .txt, posso ancora accedervi dagli oggetti restituiti da SearchQuerySet? Grazie! – abisson

+1

Con il txt intendi il modello che viene indicizzato? Ovviamente puoi mettere '{{object.manufacturer.name}}' lì mentre lavori con gli oggetti del modello di Django lì ... Puoi ancora accedere al nome se lo rimuovi dall'indice perché se accedi a 'result.object' haystack carica i dati anche dal database ... Per una buona performance lavora solo con i dati dell'indice (ma devi mantenerlo aggiornato!). –

+0

Questo potrebbe essere interessante per te: http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#load-all, https://django-haystack.readthedocs.org/en/master/best_practices. html # avoid-hitting-the-database –

Problemi correlati