2013-06-03 38 views
7

Làm thế nào để bạn tạo một lớp SearchIndex trừu tượng, tương tự như cách Django cho phép bạn tạo các mô hình cơ sở trừu tượng?Cách tạo một lớp Haystack SearchIndex trừu tượng

Tôi có một số SearchIndex mà tôi muốn cung cấp cho các trường cơ bản giống nhau (object_id, dấu thời gian, tầm quan trọng, v.v.). Hiện tại, tôi đang sao chép tất cả mã này, vì vậy tôi đang cố gắng tạo một "BaseIndex" và chỉ đơn giản là có tất cả các lớp chỉ mục thực được kế thừa từ điều này.

Tôi đang cố gắng:

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

nhưng điều này mang lại cho tôi những lỗi:

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

vì vậy tôi sau đó đã cố gắng:

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

nhưng những mang lại cho tôi lỗi:

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

Làm cách nào để kế thừa từ lớp con SearchIndex tùy chỉnh?

+0

A [chỉ số tìm kiếm 'Meta' lớp] (http://django-haystack.readthedocs.org/en/latest/searchindex_api.html#modelsearchindex) không có một thuộc tính' abstract' ... Bạn không biết bạn đến từ đâu? –

Trả lời

13

Chỉ cần không bao gồm indexes.Indexable làm cha mẹ trên bất kỳ thứ gì bạn không muốn lập chỉ mục.

Vì vậy, sửa đổi ví dụ đầu tiên của bạn.

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

Điều này làm việc cho tôi. Tôi không tin rằng bạn cần bit 'class Meta: abstract = True' để nó hoạt động. – Esteban

+0

'abstract = True' rất hữu ích nếu bạn muốn ngăn các nhà phát triển khác cố sử dụng trực tiếp lớp học của bạn. –

+1

thực sự, đó là cho các mô hình django, cho Indexes nó không có vẻ để làm việc, tôi có lẽ chỉ cần sao chép nó từ câu hỏi. –

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 
Các vấn đề liên quan