django - 加入查询集,但保留具有不同值的注释字段
问题描述
我要解决的问题是根据初始查询执行涉及多个相关步骤的搜索,例如:
搜索“迈克尔·斯科特”
首先,我们尝试直接匹配“Michael Scott”并将其保存到
full_name
- 这可能会返回最相关的对象
接下来,将运行多个查询以分别搜索每个单词,例如“Michael”和“Scott”,这将设置为
words
- 这将返回很多结果,如果它是一个非常常见的名称,大多数是噪音
最后,查询集是使用连接的,full_name | words
但这最终会因为模型的排序而混合结果,而我想要的是将所有内容保留full_name
在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
我之前设置的值,使我的订购尝试无用......
我知道还有其他方法可以实现我想要的排序,比如将查询集转换为 alist
或其他 hack,但是有没有办法以类似于我尝试过的方式来做到这一点?
谢谢!
解决方案
我认为您不想对查询集进行 OR-ing。听起来你想要一个工会。
full_name = full_name.annotate(relevance=Value(1, IntegerField()))
words = words.annotate(relevance=Value(2, IntegerField()))
return full_name.union(words).order_by('relevance')
如果查询集位于不同的模型上,则需要谨慎考虑包含哪些字段。
推荐阅读
- swift - 您如何使用核心定位让我在 Swift 所在位置 10 英里内的所有企业?
- azure - CI/CD 尝试从 Jenkins 部署到 AKS 失败
- linux - 如何使用 Bash 中的变量检查文件夹是否相同?
- node.js - Intellij IDEa Ultimate 是否支持 App Engine 中的 Node.js 部署?
- c++ - C++ 向量类定义
- html - 标题 1 导致 DIV 分开
- digital-ocean - 带有计数的 Terraform 模块不能有重复的元素
- c - == 运算符跳过条件 if 语句,即使条件为真
- kotlin - 为什么单字符和“单字符字符串”在转换为长 (.toLong()) 时不相等
- angular - 如何遍历嵌套的 Json 对象?