如何在haystack中基于多个查询参数来复合过滤搜索查询?

时间:2014-09-06 02:27:59

标签: django django-haystack

如何使用haystack SearchQuerySet()过滤多个get参数?

例如,我有以下内容:

def get_queryset(self, *args, **kwargs):
    request = self.request

    query = request.GET.get('q')
    rarity = request.GET.get('rarity')
    quality = request.GET.get('quality')
    type = request.GET.get('type')
    hero = request.GET.get('hero')

    sqs = SearchQuerySet().all()

    if query is not None:
        sqs = SearchQuerySet().filter(content=query)

    return sqs

如果稀有度不是None,或者任何不等于None的参数组合,我将如何复合sqs结果?我可以使用一堆If语句,但这似乎不是最好的方法。

我尝试了以下但是它不起作用,有更好的方法吗?

def get_queryset(self, *args, **kwargs):
    request = self.request

    query = request.GET.get('q')
    rarity = request.GET.get('rarity')
    quality = request.GET.get('quality')
    type = request.GET.get('type')
    hero = request.GET.get('hero')

    sqs = SearchQuerySet().all()

    if query is not None:
        sqs.filter(content=query)
    if rarity is not None:
        sqs.filter(rarity=rarity)

    return sqs

我不确定这是否是正确的术语,但我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

请注意,filter方法不会修改sqs。它只返回一个包含过滤器的新SearchQuerySet。如果你没有将它分配给一个变量,那么表达式sqs.filter(content=query)就不会做任何事情。

我想你是在尝试这样做:

    ...
    if query is not None:
        sqs = sqs.filter(content=query)
    if rarity is not None:
        sqs = sqs.filter(rarity=rarity)
    ...

或许这个:

    ...
    if query is not None:
        sqs = sqs.filter_or(content=query)
    if rarity is not None:
        sqs = sqs.filter_or(rarity=rarity)
    ...

(默认情况下,过滤器的行为类似于filter_and,但可以更改)