2017-06-06 97 views
0

使用Haystack和Sorl。Django Haystack。并且,或者在搜索查询集

我需要制作一个搜索查询集以通过过滤器搜索产品。

首先,我只需要过滤基于我的网站(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

像Django的查询集Q对象,Django的草垛有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)) 
) 
+0

非常感谢帮助 –