2012-02-03 27 views
11

Tôi có các cá thể mô hình Sự kiện có thể thuộc về một hoặc nhiều phiên bản mô hình Tổ chức. Tôi đã triển khai haystack 2.0.0 để lập chỉ mục tất cả các Sự kiện của tôi. Đây là một chỉ mục tìm kiếm ví dụ.Django Haystack: lọc truy vấn dựa trên nhiều mục trong danh sách.

class EventIndex(indexes.SearchIndex, indexes.Indexable): 

    text = indexes.CharField(document=True, use_template=True) 
    organization_slug = indexes.CharField(model_attr='organization__slug', 
         weight=5.0) 
    organization_name = indexes.CharField(model_attr='organization__name', 
         weight=5.0) 
    name = indexes.CharField(model_attr='name', weight=10.0) 

    ....  

    def get_model(self): 
     return Event 

    def index_queryset(self): 
     return Event.objects.filter() 

Câu hỏi của tôi là làm cách nào để tạo truy vấn SearchQuerySet lọc sự kiện dựa trên một hoặc một số tổ chức. Ví dụ, tôi muốn tìm tất cả các sự kiện thuộc về "orgnization1" và "organization3" (nơi danh sách các tổ chức có thể là bất kỳ chiều dài dài)

Là một Django truy vấn nó có thể trông giống như thế này:

Event.objects.filter(organization__in=[orgnization1, organization3]).filter(...) 

Làm cách nào để dịch điều này thành truy vấn haystack? Đây là nỗ lực của tôi, nhưng tôi không thực sự biết những gì tôi đang làm ...

organization_list = [organization1.slug, organization2.slug] 
SearchQuerySet().filter_or(organization__contains=organization_list) 

Dưới đây là một ví dụ về cách mô hình của tôi trông:

class Event(models.Model): 
    name = models.CharField(max_length=64) 
    organization = models.ForeignKey('mymodule.Organization') 
    ... 

class Organization(models.Model): 
    slug = models.SlugField(max_length=64) 
    name = models.CharField(max_length=64) 
    ... 

Bất kỳ giúp đỡ được nhiều đánh giá cao.

Trả lời

18

Tôi nghĩ mình đã tìm được giải pháp. Chỉ cần chia sẻ nó. Rõ ràng, Haystack có một đối tượng được gọi là SQ(), có chức năng tương tự như đối tượng Q() của Django. Tôi tìm thấy một nơi nào đó mà bạn có thể gọi phương thức add() trên các đối tượng Q của Django để thêm các tham số truy vấn khác. Dường như làm việc theo cùng một cách với SQ.

from haystack.forms import SearchForm 
from haystack.query import SQ, SearchQuerySet 
from haystack.views import SearchView 

class CustomSerchView(SearchView): 


    def __call__(self, request): 

     self.request = request 

     ########### Custom stuff 
     user = request.user 
     organization_list = [organization1.slug, organization2.slug, ....] 

     sq = SQ() 
     for slug in organization_list: 
      sq.add(SQ(organization_slug=slug), SQ.OR) 
     sqs = SearchQuerySet().filter(sq)   
     ########## 

     self.form = self.build_form(form_kwargs={'searchqueryset':sqs}) 
     self.query = self.get_query() 
     self.results = self.get_results() 
     return self.create_response() 
+6

Tôi nhận ra điều này là khá cũ, nhưng bạn có thể .filter (organization_slug__in = organization_list) – Nagyman

+0

đang Nice: D, thanks –

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