什么是有效的方式来进行AND / OR搜索Django-Postgres应用程序?

时间:2013-06-06 15:19:45

标签: python database django postgresql

在我的Django应用程序中,我有一个出版物模型和一个Tag模型,它们有很多关系。

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

我已经想出了如何做一个'或'搜索(即找到所有带有男女标签或时尚或设计的出版物),我已经想出了如何做一个和搜索(即查找所有出版物)有所有的标签,男人和女人,时尚和设计),但我不知道最有效的方式来做和 - 或组合。

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

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),它给出了每个“或”对的所有结果。“但现在是什么?我不知道如何继续进行搜索。 任何人都可以建议一种方法吗?

2 个答案:

答案 0 :(得分:0)

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

Combining AND OR in Django Queries

AND OR in Django queries II

答案 1 :(得分:0)

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

        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后,我更改了一个建议的解决方案(尚未被接受),使用'和'代替'&'虽然我不知道为什么,它似乎正在起作用。