Python Django Queryset最准确的搜索结果

Python Django Queryset最准确的搜索结果,python,django,django-queryset,django-q,Python,Django,Django Queryset,Django Q,我必须根据列表中元素在两个字段中的出现情况对queryset进行排序。目前,我编写了查找对象的部分: self.filter((reduce(operator.or_, ((Q(tags__contains=tag) | Q(name__contains=string)) for tag in string.split(' '))))) 但我找不到解决方案来获得正确的订单。在“标记”字段中按列表中元素的出现顺序排序将部分解决我的问题。 但是我不想迭代queryset中的所有对象。那么,您想让带

我必须根据列表中元素在两个字段中的出现情况对queryset进行排序。目前,我编写了查找对象的部分:

self.filter((reduce(operator.or_, ((Q(tags__contains=tag) | Q(name__contains=string)) for tag in string.split(' ')))))
但我找不到解决方案来获得正确的订单。在“标记”字段中按列表中元素的出现顺序排序将部分解决我的问题。
但是我不想迭代queryset中的所有对象。

那么,您想让带有特定标记的对象显示在顶部吗

有。其思想是添加SELECTNEW字段,该字段将保存布尔值,以便您可以按其排序

您应该使用django
extra
queryset方法添加此字段

MyModel.objects.extra(
    select={
        'tags_occurance': "(tags LIKE '%tag1%') + (tags LIKE '%tag2%')"
    },
).order_by('-tags_occurance')

应该是这样的。

在Django端不能这样做,除非通过迭代queryset来计算每行匹配标记的数量并分配分数。您确实希望db为您完成这项工作,如果您使用的是PostgreSQL,那么这将有助于注意:where tuple([db.literal(item)for item in args])=[“'%tag1%'”、“'%tag1%'”、“'%tag2%'”、“'%tag2%'”]这可能不是由额外({select={})引起的问题部分原因是,当我打印查询时发现正好在发生错误时的位置,并将“where”切掉查询的一部分在sql consoleWow中对我有效,这是一个非常奇怪的错误。请尝试重写您的reduce部分或使其简单化。您可以通过在django shell中执行类似的查询来尝试检查错误的位置。尝试使用少量测试标记,删除reduce部分,等等。它将指向您的某个位置。如果此错误发生,即使仅使用纯
fil(tags\uuu contains=“tag”)
,这将是一个深入挖掘的理由部分,所以它必须以某种方式与之相关。我将花今天晚上的时间讨论它,并让您了解原因。无论如何,感谢您的帮助,您的原始解决方案看起来不错,所以我批准它!顺便说一下,请查看我提供的类似问题的链接,也许您将不得不使用稍微不同的查询来获取
标记\u发生情况