Python 使用和/或搜索Django Postgres应用程序的有效方法是什么?

Python 使用和/或搜索Django Postgres应用程序的有效方法是什么?,python,database,django,postgresql,Python,Database,Django,Postgresql,在我的Django应用程序中,我有一个发布模型和一个标记模型,它们具有多对多关系 假设我有四个标签:男人、女人、时尚、设计。我想找到所有有男性或女性标签和时尚或设计标签的出版物。例如,在搜索字段中,我可以输入:(男| |女)和&(时装| |设计)。换言之,结果应该产生每个“或”对中至少有一个标签的出版物 我已经找到了如何只进行“或”搜索(即查找所有带有男性或女性或时尚或设计标签的出版物)和如何进行“和”搜索(即查找所有带有所有标签、男性和女性以及时尚和设计标签的出版物),但我不知道进行“和”或“

在我的Django应用程序中,我有一个发布模型和一个标记模型,它们具有多对多关系

假设我有四个标签:男人、女人、时尚、设计。我想找到所有有男性或女性标签和时尚或设计标签的出版物。例如,在搜索字段中,我可以输入:(男| |女)和&(时装| |设计)。换言之,结果应该产生每个“或”对中至少有一个标签的出版物

我已经找到了如何只进行“或”搜索(即查找所有带有男性或女性或时尚或设计标签的出版物)和如何进行“和”搜索(即查找所有带有所有标签、男性和女性以及时尚和设计标签的出版物),但我不知道进行“和”或“和”组合的最有效方法

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

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_代表_标签)列表(pubs_代表_集合),它会给出每个“或”对的所有结果。但是现在怎么办?我不知道如何进行and搜索。
有人能建议一种方法吗?

我不确定是否有方法可以做到这一点。我想说,尝试将过滤器与Q结合起来,但偶然发现:


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

        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)))

在看了这个问题之后,我改变了其中一个建议的解决方案(该方案未被接受)使用“and”而不是“&”,虽然我不知道为什么,但它似乎起了作用。

什么是pub_谓词?而且,您的查询与您的解释不同步。您能更具体一点吗?pub_谓词是我搜索数据库时使用的谓词。我在for循环中构建谓词,以便可以搜索未定义数量的标记ed.我刚刚编辑了上面的代码以使其更准确一些,但不,它与我想要的不一致,我只是想展示我到目前为止所拥有的。上面所做的只是搜索或对并将它们组合成一个列表。我仍在试图弄清楚如何做“和”组件。