2013-06-03 18 views
7

Come si crea una classe SearchIndex astratta, simile alla modalità con cui Django consente di creare modelli di base astratti?Come creare una classe Haystack SearchIndex astratta

Ho diversi indici di ricerca che mi piacerebbe fornire gli stessi campi di base (object_id, timestamp, importanza, ecc.). Attualmente sto duplicando tutto questo codice, quindi sto provando a creare un "BaseIndex" e ho semplicemente ereditato tutte le classi indice reali da questo.

sto provato:

class BaseIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    object_id = indexes.IntegerField() 
    timestamp = indexes.DateTimeField() 

    class Meta: 
     abstract = True 

class PersonIndex(BaseIndex): 
    ...other fields... 

ma questo mi dà l'errore:

NotImplementedError: You must provide a 'model' method for the '<myapp.search_indexes.BaseIndex object at 0x18a7328>' index. 

così ho poi provato:

class BaseIndex(object): 
    text = indexes.CharField(document=True, use_template=True) 
    object_id = indexes.IntegerField() 
    timestamp = indexes.DateTimeField() 

class PersonIndex(BaseIndex, indexes.SearchIndex, indexes.Indexable): 
    first_name = indexes.CharField() 
    middle_name = indexes.CharField() 
    last_name = indexes.CharField() 

ma questi mi dà errore:

SearchFieldError: The index 'PersonIndex' must have one (and only one) SearchField with document=True. 

Come ereditare da una sottoclasse SearchIndex personalizzata?

+0

A [indici di ricerca 'classe Meta'] (http://django-haystack.readthedocs.org/en/latest/searchindex_api.html#modelsearchindex) non ha un attributo' abstract' ... Non sai da dove lo hai preso? –

risposta

13

Semplicemente non includere indexes.Indexable come genitore su qualcosa che non vuoi indicizzare.

Quindi modifica il tuo primo esempio.

class BaseIndex(indexes.SearchIndex): 
    text = indexes.CharField(document=True, use_template=True) 
    object_id = indexes.IntegerField() 
    timestamp = indexes.DateTimeField() 

    class Meta: 
     abstract = True 

class PersonIndex(BaseIndex, indexes.Indexable): 
    ...other fields... 
+0

Questo ha funzionato per me. Non credo che tu abbia bisogno del bit 'class Meta: abstract = True' perché funzioni. – Esteban

+0

'abstract = True' è utile se vuoi impedire ad altri sviluppatori di utilizzare direttamente la tua classe. –

+1

in realtà, questo è per i modelli di django, per gli indici non sembra funzionare, probabilmente l'ho appena copiato dalla domanda. –

4
class BaseIndex(indexes.SearchIndex): 
    model=None   

    text = indexes.CharField(document=True, use_template=True) 
    object_id = indexes.IntegerField() 
    timestamp = indexes.DateTimeField() 

    def get_model(self): 
     return self.model 

class PersonIndex(BaseIndex, indexes.Indexable): 
    first_name = indexes.CharField() 
    middle_name = indexes.CharField() 
    last_name = indexes.CharField() 

    def get_model(self): 
     return Person 
Problemi correlati