【问题标题】:How can I filter a Haystack SearchQuerySet for None on an IntegerField如何在 IntegerField 上为 None 过滤 Haystack SearchQuerySet
【发布时间】:2013-11-14 11:51:14
【问题描述】:

这让我有点生气,但看起来应该很简单。

我正在使用 Django 和 Haystack,并且有一个搜索索引,其中包括一个允许为空的 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))

这行得通,但显然不应该这样做:)

谁能帮忙?

谢谢!

【问题讨论】:

    标签: python django django-haystack


    【解决方案1】:

    我觉得这个问题没有得到回答。似乎操作员在询问如何使用带有 ElasticSearch 后端的 haystack.query.SearchQuerySet 过滤空条目。

    在上面的例子中,替换

    self.searchqueryset.filter(group__isnull=True)
    

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

    不直观,但它是迄今为止我让它工作的唯一方法。

    【讨论】:

    • 谢谢。如果可能,请添加此答案的来源。
    • @Mangolisk 谢谢,这对我也适用于.exclude。您知道如何搜索不包含字段 a 丢失 字段 b 丢失的对象吗?语法明显无效的示例:orphans = children.exclude(_missing_='mother' AND _missing_='father') - 谢谢!
    • 回答自己:使用 SQ 解决:django-haystack.readthedocs.io/en/v2.4.1/…
    【解决方案2】:

    如果你使用的是ElasticSearch,可以不用打补丁,直接使用原生的ElasticSearch:

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

    反之,过滤所有具有非空组字段的文档:

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

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

    参考资料:

    【讨论】:

    • 不错.. 有一件事你有错字,应该是self.searchqueryset.exclude(group = Raw("[* TO *]"))
    • @psychok7 谢谢,已修复。
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢!真的很有用。不使用 SOLR,我们使用的是 ElasticSearch。哦,好吧。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多