1

我正在使用 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 的计数?

谢谢!

4

0 回答 0