如何在IntegerField上过滤Haystack SearchQuerySet for None

时间:2013-11-14 11:51:15

标签: python django django-haystack

这让我有点生气,但似乎应该很简单。

我正在使用Django和Haystack并且有一个包含允许null的IntegerField的搜索索引。这是基于Django的相关模型,但我认为这不重要。例如:

class ThingIndex(indexes.ModelSearchIndex, indexes.Indexable):
    group = indexes.IntegerField(model_attr='group__id', null=True)

    class Meta:
        model = Thing

我有时希望我的Haystack查询返回此字段的None / Null项,所以我在搜索表单的__init__中进行过滤,但是我无法进行查询来执行此操作。我尝试过的最明显的方式是:

self.searchqueryset.filter(group__isnull=True)  # how to do it on a regular Django queryset

但这不会返回任何记录。

现在我正在解决这个问题:

self.searchqueryset.exclude(group__in=range(1,100))

哪个有效,但显然不是应该这样做的方式:)

有人可以帮忙吗?

谢谢!

3 个答案:

答案 0 :(得分:11)

如果您使用的是ElasticSearch,只需使用本机ElasticSearch就可以在不修补的情况下完成解决方案:

from haystack.inputs import Raw
self.searchqueryset.exclude(group = Raw("[* TO *]"))

反过来,过滤所有具有非emtpy组字段的文档:

from haystack.inputs import Raw
self.searchqueryset.filter(group = Raw("[* TO *]"))

这也适用于SOLR以及其他Haystack后端应用相同的概念,但具有后端搜索语言的特定语法。

参考文献:

答案 1 :(得分:9)

我觉得这个问题没有得到解答。看来op正在询问如何使用带有ElasticSearch后端的haystack.query.SearchQuerySet来过滤空条目。

在上面的示例中,替换

self.searchqueryset.filter(group__isnull=True)

self.searchqueryset.filter(_missing_='group')

不直观,但它是我到目前为止工作的唯一方法。

答案 2 :(得分:3)

如果您正在使用SOLR,您可能希望查看以下链接:

1)https://github.com/toastdriven/django-haystack/commit/9332a91a7f0e4b33d7e20aa892d156305c12dfe3
2)https://github.com/toastdriven/django-haystack/issues/163

有一个SOLR的补丁,允许这样的查询,但对于其他后端,可能没有。