2013-05-31 25 views
5

tôi có các mô hình sau:Nhận đối tượng chính nước ngoài tại SearchQuerySet quả 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") 
    .... 

và các chỉ số sau:

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

và cho equipmentmodel_text.txt tôi

{{đối tượng .name}} {{object.manufacturer}}

Tuy nhiên, khi bao giờ tôi thực hiện truy vấn này:

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

Tôi chỉ nhận được pk của nhà sản xuất. Tôi muốn toàn bộ đối tượng (hoặc ít nhất là tên của nó). Điều đó có thể không?!

Cảm ơn!

Trả lời

7

Để đạt được điều đó bạn phải đã add the manufacturer's name vào chỉ mục khi lập chỉ mục:

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

rồi nó hoạt động! Bây giờ ... Tôi hơi bối rối như sự khác biệt của các lĩnh vực trong EquipmentModelIndex và những gì trong các thiết bịmodel_text.txt ...? Trong tệp .txt, tôi có nên đặt {{object.manufacturer.name}} hoặc {{object.manufacturer_name}} không? Làm thế nào đến ngay cả khi tôi loại bỏ hoàn thành manufacturer_name từ các chỉ mục và .txt, tôi vẫn có thể truy cập nó từ các đối tượng được trả về từ SearchQuerySet? Cảm ơn! – abisson

+1

Với txt bạn có nghĩa là mẫu được lập chỉ mục? Tất nhiên bạn có thể đặt '{{object.manufacturer.name}}' ở đó khi bạn làm việc với các đối tượng mô hình của Django ở đó ... Bạn vẫn có thể truy cập tên nếu bạn xóa nó khỏi chỉ mục vì nếu bạn truy cập 'result.object' haystack tải dữ liệu bổ sung từ cơ sở dữ liệu ... Để có hiệu suất tốt chỉ làm việc với dữ liệu từ chỉ mục (nhưng sau đó bạn cần phải giữ cho nó tăng tốc!). –

+0

Điều này có thể thú vị đối với bạn: 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 –

Các vấn đề liên quan