在我的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),它给出了每个“或”对的所有结果。“但现在是什么?我不知道如何继续进行搜索。 任何人都可以建议一种方法吗?
答案 0 :(得分:0)
答案 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后,我更改了一个建议的解决方案(尚未被接受),使用'和'代替'&'虽然我不知道为什么,它似乎正在起作用。