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