什么是做AND/OR搜索Django-Postgres应用程序的有效方法?



在我的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_for_set)的列表(pubs_for_tags),该列表给出每个"或"对的所有结果。但现在呢?我不知道该如何进行搜索。有谁能提出一个方法吗?

我不确定是否有办法做到这一点。我想说,试着把filter和Q结合起来,但后来偶然发现了这些:

Django查询中的AND OR组合

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

        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查询过滤器结合AND和OR与Q对象不返回预期的结果,我改变了一个建议的解决方案(尚未被接受)使用'和'而不是'&',它似乎是工作的,虽然我不知道为什么。

相关内容

最新更新