【问题标题】:What is an Efficient Way to do an AND/OR Search Django-Postgres App?执行 AND/OR 搜索 Django-Postgres 应用程序的有效方法是什么?
【发布时间】:2013-06-02 16:31:52
【问题描述】:

在我的 Django 应用程序中,我有一个 Publication 模型和一个 Tag 模型,它们具有多对多的关系。

假设我有四个标签:男士、女士、时尚、设计。我想找到所有具有与其相关联的男性或女性标签以及与之相关联的时尚或设计标签的出版物。例如,在搜索字段中,我可能会输入:(men || women) && (fashion || design)。换句话说,结果应该产生具有至少每个“或”对中有一个标签的出版物。

我已经想出了如何只进行“或”搜索(即查找所有带有男性或女性或时尚或设计标签的出版物),并且我已经弄清楚如何进行“和”搜索(即查找所有出版物有所有标签,男人和女人,时尚和设计),但我不知道最有效的方法来做和-或组合。

到目前为止,我已经拆分了查询字符串以获取“或”对列表,并开始创建搜索谓词,但后来我想,我将如何处理这些结果?比如……

if 'qTag' in request.GET:
        or_queries = request.GET['qTag'].split('&&')

        for or_query in or_queries:
            or_query_set = or_query.split()
            for sub_query in or_query_set:
                if pub_predicate:
                    pub_predicate = pub_predicate | Q(tags__title__istartswith=sub_query)
                else:
                    pub_predicate = Q(tags__title__istartswith=sub_query)
            pubs_for_set = Publication.objects.filter(pub_predicate).distinct()
            pubs_for_tags.append(pubs_for_set)
            pub_predicate = None
            pubs_for_set = None

执行上述操作会给我一个列表 (pubs_for_tags) 的列表 (pubs_for_set),它给出了每个“或”对的所有结果。但是现在呢?我不知道如何进行和搜索。 谁能建议一种方法来做到这一点?

【问题讨论】:

  • 什么是 pub_predicate ?此外,您的查询与您的解释不同步。你能说得更具体些吗?
  • pub_predicate 是我用来搜索数据库的谓词。我在 for 循环中构建谓词,以便可以搜索未定义数量的标签。我刚刚编辑了上面的代码以更准确一点,但不,它与我想要的不符,我只是想展示我到目前为止所拥有的。以上所做的就是搜索 or 对并将它们组合成一个列表。我仍在试图弄清楚如何做'and'组件。

标签: python database django postgresql


【解决方案1】:

我不确定是否有办法做到这一点。我想说尝试将 filter 与 Q 结合使用,但后来偶然发现了这些:

Combining AND OR in Django Queries

AND OR in Django queries II

【讨论】:

    【解决方案2】:

    我想我可能已经找到了解决我自己问题的方法。如果我有以下标签:

            query1 = "men"
            query2 = "women"
            query3 = "fashion"
            query4 = "design"
    

    我想找到所有带有男性或女性以及时尚或设计标签的出版物,如果我这样做似乎可以:

    pubs = Publication.objects.filter(Q(tags__title__iexact=query1) | Q(tags__title__iexact=query2) and (Q(tags__title__iexact=query3) | Q(tags__title__iexact=query4)))
    

    看了这个问题后:Django query filter combining AND and OR with Q objects don't return the expected results,我将建议的解决方案之一(尚未被接受)更改为使用“和”而不是“&”,虽然我不知道为什么,但它似乎有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      相关资源
      最近更新 更多