【问题标题】:Django Queryset most accurate search resultDjango Queryset 最准确的搜索结果
【发布时间】:2014-08-08 17:33:03
【问题描述】:

我必须通过两个字段中列表中元素的出现来对查询集进行排序。目前我写了查找对象的部分:

self.filter((reduce(operator.or_, ((Q(tags__contains=tag) | Q(name__contains=string)) for tag in string.split(' ')))))

但我找不到正确订购的解决方案。在“标签”字段中按列表中元素的出现排序将部分解决我的问题。 但我不喜欢遍历查询集中的所有对象..

【问题讨论】:

  • 你不能在 Django 端这样做,除非通过遍历查询集来计算每行匹配标签的数量并分配一个分数。您真的希望数据库为您完成这项工作,如果您使用的是 PostgreSQL,那么这将有助于github.com/djangonauts/djorm-ext-pgfulltext

标签: python django django-queryset django-q


【解决方案1】:

那么,你想让带有特定标签的对象显示在顶部吗?

similar problem。这个想法是添加选择新字段,该字段将保存布尔值,因此您可以按它进行排序。

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

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

应该是这样的。

【讨论】:

  • 一些注释:pastebin.com/c0Jvd8qx where tuple([db.literal(item) for item in args]) = ["'%tag1%'", "'%tag1%'", "' %tag2%'", "'%tag2%'"] 这可能不是由 extra({select={}) 部分引起的问题,因为当我在发生错误时打印在位置之前找到的查询并切断“where”部分时它在 sql 控制台中对我有用的查询
  • 哇,这真是个奇怪的错误。尝试重写您的 reduce 部分或使其简单。您可以尝试通过在 django shell 中执行类似的查询来检查错误在哪里。尝试使用少量测试标签,删除 reduce 部分等。它会指向某个地方。如果即使只是简单的filter(tags__contains="tag") 也会发生此错误,这将是深入挖掘的理由。
  • 好吧,没有 extra() 部分它工作得很好,所以它必须以某种方式与之相关。我今天晚上会花我今天的晚上,让你知道原因。无论如何感谢您的帮助,您的原始解决方案看起来不错,所以我批准它!
  • 顺便说一下,看看我提供的类似问题的链接,也许你将不得不使用一些不同的查询来获取tags_occurance
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2015-11-21
相关资源
最近更新 更多