Django Haystack。并且,或在搜索查询集中

时间:2017-06-06 13:37:06

标签: python django search django-haystack pysolr

使用:Haystack和Sorl。

我需要创建一个搜索查询集来按过滤器搜索产品。

首先,我需要根据我的网站(Django网站框架)过滤产品。所以我这样做:

sqs = sqs.filter(site=site.pk)

返回此类搜索查询:

site:(6)

行。

然后我需要按属性过滤:

sqs = sqs.filter(attribute_codes='power', attribute_values__range=(20, 30))
sqs = sqs.filter(attribute_codes='power', attribute_values__range=(40, 50))

它会生成这样的查询:

(site:(6) AND attribute_codes:(power) AND attribute_values:(["20" TO "30"]) AND attribute_values:(["40" TO "50"]))

但是,我需要进行这样的查询:

(site=6) AND ((attributes1) OR (attributes2))

所以我尝试按属性更改为filter_or

 sqs = sqs.filter_or(attribute_codes='power', attribute_values__range=(20, 30))
sqs = sqs.filter_or(attribute_codes='power', attribute_values__range=(40, 50))

结果是:

(site:(6) OR (attribute_codes:(power) AND attribute_values:(["20" TO "30"])) OR (attribute_codes:(power) AND attribute_values:(["40" TO "50"])))

但我需要其他人:

    (site=6) AND ((attributes1) OR (attributes2))

那么,怎么做? 请帮帮我

1 个答案:

答案 0 :(得分:2)

与Django的queryset Q对象一样,django haystack有一个SQ对象,允许在过滤时使用|&运算符

sqs = sqs.filter(site=6)
sqs = sqs.filter(SQ(attribute_codes='power') | SQ(attribute_values__range=(20, 30))

sqs = sqs.filter(
    SQ(site=6) & (SQ(attribute_codes='power') | SQ(attribute_values__range=(20, 30))
)