2013-06-03 3 views
7

Wie erstellen Sie eine abstrakte SearchIndex-Klasse, ähnlich wie Django abstrakte Basismodelle erstellen kann?So erstellen Sie eine abstrakte Heuhaufen SearchIndex-Klasse

Ich habe mehrere SearchIndexes, die ich die gleichen grundlegenden Felder (object_id, timestamp, Wichtigkeit usw.) geben möchte. Momentan kopiere ich diesen ganzen Code, also versuche ich einen "BaseIndex" zu erstellen und lasse einfach alle realen Indexklassen davon erben.

ich versucht:

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... 

aber das gibt mir den Fehler:

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

so dann habe ich versucht:

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

aber diese gibt mir Fehler:

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

Wie erben ich von einer benutzerdefinierten SearchIndex-Unterklasse?

+0

A [Suchindizes 'Meta' Klasse] (http://django-haystack.readthedocs.org/en/latest/searchindex_api.html#modelsearchindex) nicht ein Attribut' Resümees ... Weiß ich nicht, woher du das hast? –

Antwort

13

Geben Sie indexes.Indexable nicht als übergeordnetes Element für alles ein, das nicht indexiert werden soll.

Also ändern Sie Ihr erstes Beispiel.

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

Das hat für mich funktioniert. Ich glaube nicht, dass Sie das "Klasse Meta: abstract = True" -Bit brauchen, damit es funktioniert. – Esteban

+0

'abstract = True' ist nützlich, wenn Sie andere Entwickler stoppen möchten, die versuchen, Ihre Klasse direkt zu verwenden. –

+1

eigentlich, das ist für Django-Modelle, für Indizes scheint es nicht zu funktionieren, ich habe es wahrscheinlich nur von der Frage kopiert. –

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 
Verwandte Themen