【问题标题】:How to compound filter search query based on multiple query parameters in haystack?haystack中如何根据多个查询参数复合过滤搜索查询?
【发布时间】:2014-09-06 02:27:58
【问题描述】:

如何使用 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

如果 rarity 不是 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

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

【问题讨论】:

  • 我不确定我是否理解您的问题,但如果您尝试使用各种关键字参数构建 SearchQuerySet,您应该将 filter 语句分配回 sqs -- 这将具有将它们链接在一起的效果:sqs = sqs.filter(content=query) ... 然后 sqs = sqs.filter(rarity=rarity) 等。

标签: django django-haystack


【解决方案1】:

请注意,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,但可以更改)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多