我正在使用 django-haystack 和 elasticsearch。我想在网站上展示运动会。现在我有两个方面;运动和训练水平。它们都是一个复选框列表,并且是“或”导向的,这意味着可以选择多个。
例如,有 3 个训练选项,每个选项有 4 种不同的训练。所有的篮球训练都是针对初学者的,所有的足球和舞蹈训练都是针对高级的。这将导致以下结果:
训练选项:篮球(4)、足球(4)、舞蹈(4)
培训级别:初级 (4)、高级 (8)
如果我单击篮球,则会显示以下结果:
篮球 (3) , 足球 (3), 舞蹈 (3)
初学者 (3)
在这种情况下,先进的被排除在外。我想要的是:
篮球 (3) , 足球 (3), 舞蹈 (3)
初级 (3), 高级 (0)
我使用以下代码:
from haystack.forms import FacetedSearchForm
class FacetedSearchSportForm(FacetedSearchForm):
def __init__(self, *args, **kwargs):
data = dict(kwargs.get("data", []))
self.sports = data.get('sports', [])
self.level = data.get('level', [])
super().__init__(*args, **kwargs)
def search(self):
sqs = super().search()
if not self.is_valid():
return self.no_query_found()
if self.sports:
query = None
for sport in self.sports:
if query:
query += u' OR '
else:
query = u''
query += u'"%s"' % sqs.query.clean(sport)
sqs = sqs.narrow(u'sports_exact:%s' % query)
if self.level:
query = None
for level in self.level:
if query:
query += u' OR '
else:
query = u''
query += u'"%s"' % sqs.query.clean(level)
sqs = sqs.narrow(u'level_exact:%s' % query)
return sqs
如果我用 sqs.filter 替换 sqs.narrow ,也会发生同样的情况。有谁知道我如何在使用构面过滤时包含 0 的计数?
谢谢!