Django Haystack:根据列表中的多个项目过滤查询。

时间:2012-02-03 17:16:11

标签: django search django-haystack relation django-queryset

我有可以属于一个或多个组织模型实例的事件模型实例。我已经实现了haystack 2.0.0来索引我的所有事件。这是一个示例搜索索引。

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

我的问题是如何构建一个基于一个或多个组织过滤事件的SearchQuerySet查询。例如,我想查找属于“orgnization1”和“organization3”的所有事件(其中)组织清单可以是任何长度)

作为Django查询,它可能看起来像这样:

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

如何将其转换为haystack查询?这是我的尝试,但我真的不知道我在做什么......

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

以下是我的模型外观的示例:

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:19)

我想我找到了解决方案。只是分享它。显然,Haystack有一个名为SQ()的对象,其功能类似于Django的Q()对象。我找到了一个可以在Django的Q对象实例上调用add()方法来添加更多查询参数的地方。似乎与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()