连接查询集,但将带注释的字段保留为不同的值

时间:2019-04-09 12:54:23

标签: django

我要解决的问题是基于初始查询执行涉及多个相关步骤的搜索,例如:

  • 搜索“ 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或其他黑客手段,但是有没有办法像我尝试过的那样?

谢谢!

1 个答案:

答案 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')

如果查询集位于不同的模型上,则需要注意其中包括哪些字段。