我要解决的问题是基于初始查询执行涉及多个相关步骤的搜索,例如:
搜索“ Michael Scott”
首先,我们尝试直接匹配“ Michael Scott”并将其保存到full_name
接下来,将运行多个查询来分别搜索每个单词(例如“ Michael”和“ Scott”),并将其设置为words
最后,使用full_name | words
连接查询集,但是由于模型的排序,最终混合了结果,而我想要的是将full_name
中的所有内容保留在{{ 1}}。
为解决此问题,我用两个新值注释了两个查询集,并尝试在之后按以下顺序排序:
words
发生的事情是,full_name = full_name.annotate(relevance=Value(1, IntegerField()))
words = words.annotate(relevance=Value(2, IntegerField()))
return (full_name | words).order_by('relevance')
中的所有内容都更改为也具有words
,而不是保留我之前设置的relevance=1
的值,这使我的订购尝试无用了...
我知道还有其他方法可以实现所需的排序,例如将查询集转换为2
或其他黑客手段,但是有没有办法像我尝试过的那样?
谢谢!
答案 0 :(得分:0)
我认为您不希望对查询集进行“或”操作。听起来您想要union。
full_name = full_name.annotate(relevance=Value(1, IntegerField()))
words = words.annotate(relevance=Value(2, IntegerField()))
return full_name.union(words).order_by('relevance')
如果查询集位于不同的模型上,则需要注意其中包括哪些字段。