【问题标题】:How to filter Haystack SearchQuerySets by related models如何通过相关模型过滤 Haystack SearchQuerySets
【发布时间】:2013-05-22 03:51:54
【问题描述】:

如何按相关模型字段过滤/加入 Haystack SearchQuerySet?

我有一个类似的查询:

sqs = SearchQuerySet().models(models.Person)

这会返回与等效管理页面返回的结果相同的结果。

但是,如果我尝试按由外键链接的模型记录进行过滤:

sqs = sqs.filter(workplace__role__name='teacher')

它什么也不返回,即使页面/admin/myapp/person/?workplace__role__name=teacher 返回了几条记录。

我不想对这些相关模型进行任何全文搜索。我只想做一个简单的完全匹配过滤器。 Haystack 可以做到吗?

【问题讨论】:

    标签: python django django-haystack


    【解决方案1】:

    您无法使用 haystack 支持的搜索引擎执行连接。 要进行这样的查询,您需要在搜索索引中以“非规范化”方式添加要过滤的信息:

    class ProfileIndex(indexes.SearchIndex, indexes.Indexable):
        # your other fields, most likely model attributes
        role_name = indexes.CharField()
    
        def get_model(self):
            return Person
    
        def prepare_role_name(self, person):
            return person.workplace.role_name
    

    然后您可以过滤字段role_name。如果例如,请确保更新您的索引。名称发生变化,则您必须更新搜索索引中的所有相应条目。

    【讨论】:

    • 您的具体示例没有意义,因为 person->workplace 链接是一对多的关系。
    • 嗯,这就是这些搜索引擎的工作方式……另一方面,访问这种非规范化信息是超快的,因为您不需要进行任何进一步的查找/连接来访问它。如果您在显示搜索结果时避免访问数据库,您可以获得很大的性能优势......另请参阅django-haystack.readthedocs.org/en/latest/…
    • 不知道您的确切数据布局...您可以使用 haystack 的 MultiValueField 可以保存一个列表(并且您可以过滤单个值)。请参阅此要点gist.github.com/cooncesean/2892533
    • 感谢您的澄清。
    【解决方案2】:

    你也可以这样做:

    class ProfileIndex(indexes.SearchIndex, indexes.Indexable):
        # your other fields, most likely model attributes
        role_name = indexes.CharField(model_attr='workplace__role__name')
    
        def get_model(self):
            return Person
    

    您可以按角色名称进行过滤。 我在这里看到了。 http://django-haystack.readthedocs.org/en/latest/searchindex_api.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2021-05-02
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多